2010-11-25 167 views
13

我在使用基類的shared_ptr時遇到問題,我無法在解引用它時調用派生類的方法。我相信代碼會比我更詳細:boost :: shared_ptr和dynamic cast

class Base : public boost::enable_shared_from_this<Base> 
{ 
    public: 
    typedef boost::shared_ptr<BabelNet> pointer; 
}; 

class Derived : public Base 
{ 
    public: 
    static pointer create() 
       { 
         return pointer(new Derived); 
       } 
    void    anyMethod() 
    { 
     Base::pointer foo = Derived::create(); 
     // I can't call any method of Derived with foo 
     // How can I manage to do this ? 
     // is dynamic_cast a valid answer ? 
     foo->derivedMethod(); // -> compilation fail 
    } 

}; 
+1

如果你的例子是可編譯的,那當然會對這條有問題的代碼段進行評論。 – 2010-11-25 14:26:04

回答

18

看到static_cast with boost::shared_ptr?

你需要使用dynamic_pointer_cast能得到相應的shared_ptr實例。 (對應於dynamic_cast

+1

爲什麼不`static_pointer_cast`?我想也許這個例子並不代表真實的代碼,但是這個例子不需要動態轉換(因爲對象是目標類型),並且不允許使用一個(因爲這兩個類都沒有任何虛函數) 。 – 2010-11-25 14:03:32

1

如果derivedMethod沒有在基類(虛擬的或沒有)聲明,那麼這是正常的編譯會失敗。共享的ptr知道並使用基類(通過它所持有的指針),並且對派生類及其特定方法一無所知。

+0

如果指針是派生類的typedef,它是否可以被上傳,這樣外部類只能知道Base :: pointer? – HolyLa 2010-11-25 14:12:32

0

即使使用原始指針,您的代碼也不起作用。

即使在基類中,也需要聲明derivedMethod()方法,或者指向Derived對象。

4

共享指針與否,當您有一個指向Base的指針時,您只能從Base調用成員函數。

如果你真的需要dynamic_cast,你可以使用dynamic_pointer_castboost,但很可能你不應該這樣做。相反,考慮一下你的設計:Derived是一個Base,這是一個非常強大的關係,所以仔細考慮一下Base接口以及是否真的必須知道具體類型。

相關問題