2009-02-06 60 views
6
#include "iostream" 

    class A { 
     private: 
     int a; 
     public : 

     A(): a(-1) {} 
     int getA() { 
      return a; 
     } 

    }; 

    class A; 

    class B : public A { 
     private: 
     int b; 
     public: 

     B() : b(-1) {} 

     int getB() { 
      return b; 
     } 

    }; 

    int main() { 
     std::auto_ptr<A> a = new A(); 

     std::auto_ptr<B> b = dynamic_cast<std::auto_ptr<B> > (a); 

     return 0; 

    } 

錯誤:無法將dynamic_cast`(&一) - >性病:: auto_ptr的< _TP> ::得到()const的爲什麼auto_ptr的dynamic_cast失敗?

+0

哪裏的:: get()聲明? – cbrulak 2009-02-06 03:44:02

回答

11

好,std::auto_ptr<B>不是從std::auto_ptr<A>的。但B源自A。 auto_ptr不知道那個(它不是那麼聰明)。看起來你想使用共享所有者指針。 boost::shared_ptr是理想的,它也提供了一個dynamic_pointer_cast:

boost::shared_ptr<A> a = new A(); 
boost::shared_ptr<B> b = dynamic_pointer_cast<B> (a); 

對於auto_ptr的,這樣的事情不能真正發揮作用。因爲所有權將轉移到b。但如果演員失敗,b不能獲得所有權。我不清楚該怎麼做。你可能不得不說,如果演員失敗,a會繼續擁有所有權 - 這聽起來像會造成嚴重的麻煩。最好使用shared_ptr開始。無論ab然後將指向同一個對象 - 但B作爲shared_ptr<B>ashared_ptr<A>

5

動態轉換不工作的方式。 A : public B並不意味着auto_ptr<A> : public auto_ptr<B>。這就是爲什麼助推的shared_ptr提供shared_dynamic_cast。你可以寫,雖然一個auto_ptr動態轉換:

template<typename R, typename T> 
std::auto_ptr<R> auto_ptr_dynamic_cast(std::auto_ptr<T>& in) { 
    auto_ptr<R> rv; 
    R* p; 
    if(p = dynamic_cast<R*>(in.get())) { 
     in.release(); 
     rv = p; 
    } 
    return rv; 

}

要知道什麼會發生在這裏。由於auto_ptr具有所有權語義,成功向下意味着更原始的類型,auto_ptr不再擁有所有權。

0

您正試圖將A*(由a.get()返回)轉換爲std::auto_ptr<B>,並且由於第二個連指針類型都不會失敗。也許你只是想將它轉換爲B*

std::auto_ptr<A> a(new A()); 
std::auto_ptr<B> b(dynamic_cast<B*>(a.get())); 

這仍然無法編譯,因爲AB並不多態類型。 A需要有一個虛擬函數以使類型變爲多態。這將編譯,但演員只會拋出std::bad_cast,因爲它不是真的B*

即使它是一個B*,它會以可怕的方式失敗,如果你嘗試使用它std::auto_ptr s ab將假定他們擁有該對象並在以後釋放它,導致各種內存損壞。演員成功後您可能想要使用a.release()

0

我想C++在vtable中存儲RTTI(運行時類型信息)。因此,爲了使用dynamic_cast <>實例對象,該對象需要'vtable'。只有當至少有一個函數在類中被聲明爲「虛擬」時,C++纔會創建vtable。

A類和B類沒有虛擬功能。這可能是dynamic_cast失敗的原因。嘗試在基類中聲明一個虛擬析構函數。