2016-06-30 73 views
2

說我,我有這些類:有沒有辦法使用dynamic_cast投射到孩子?

struct Parent {}; 
struct Child : public Parent { 
    void func() {} 
}; 

現在說,我想創造這樣的功能:

void foo(Parent* arg) { 
    auto child = dynamic_cast<Child*>(arg); 

    if(child != nullptr) child->func(); 
} 

但很明顯,這將明顯地給我的錯誤:

dynamic_cast : Parent is not a polymorphic type

所以我不能做的dynamic_cast步驟,有沒有一種方法,我可以驗證arg其實是一個Child*在運行時?

回答

5

不,你不能。您可以使用RTTIRun Time Type Information)獲得有關運行對象的信息。對象的RTTI存儲在它的類的虛擬表中。

多態類(即具有一個或多個虛擬函數的類或從多態類派生的類)的每個對象都包含vptr,它是指向相應類的虛擬表的指針。非多態類型的對象沒有vptr,並且其類沒有虛表。因此,您不能在非多態類型上使用dynamic_cast

所以,@lorro說,你應該添加一個虛函數Parent,和最簡單的選擇是在一個虛擬的析構函數(你應該這樣做無論如何):

struct Parent { 
    virtual ~Parent() {} 
}; 
8

給你的Parent類虛擬一個函數。想到析構函數,有幾個原因(比如通過基本ptr刪除子項等)。

相關問題