2012-05-20 144 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并检查它是否成功,但这是一个相对昂贵的操作。相比之下,静态转换根本不会产生任何运行成本。