2012-05-20 49 views
1

這裏向你展示我的意思究竟是很難形容毫不代碼:如何從另一個繼承類的繼承類的說話

class Object 
{ 
     // attributes.. 
}; 

class Attribute 
{ 
    public: 
    void myfunc(); 
}; 

class Character: public Object, public Attribute 
{ 

}; 

void main() 
{ 
    Object* ch = new Character; 
    // How can I call the myfunc() from Attribute 
    // tried static_cast<Attribute*>(ch); 
} 

我纔剛剛有一個對象類指針,我不知道 如果它是一個字符對象或從屬性類繼承的另一個對象,我知道的是該類繼承自屬性類。

回答

3

交叉鑄造只能由dynamic_cast完成。

Object * o = new Character; 
Attribute * a = dynamic_cast<Attribute*>(o); 

if (!a) throw_a_fit(); 

a->myfunc(); 

但是,爲了這個工作,你必須有多態基類(它們必須至少有一個虛函數)。

2

如果你知道你有正確類型的對象,你可以明確地投:

Object * ch = /* something that's a Character */ 

static_cast<Attribute *>(static_cast<Character *>(ch))->myfunc(); 

顯然,這將不會是正確的,如果最派生的對象的類型指向ch不子類型爲Attribute

如果您的類層次結構是多態的(即每個基類中至少有一個您關心的虛函數),那麼可以在運行時直接使用dynamic_cast並檢查它是否成功,但這是一個相對昂貴的操作。相比之下,靜態轉換根本不會產生任何運行成本。