如何与另一个继承类的继承类对话

时间:2012-05-20 15:36:41

标签: c++ function inheritance

这里向您展示我的意思,没有代码很难描述:

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);
}

我只有一个Object Class指针,我不知道 如果它是一个字符对象或继承自的对象 属性类,我所知道的是该类继承自Attribute Class。

2 个答案:

答案 0 :(得分:3)

交叉投射只能通过dynamic_cast来完成。

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

if (!a) throw_a_fit();

a->myfunc();

但是,要使其工作,您必须具有多态基类(它们必须至少具有一个虚函数)。

答案 1 :(得分:2)

如果你知道你有一个正确类型的对象,你可以明确地转换:

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

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

如果ch指向的派生程度最高的对象的类型不是Attribute的子类型,显然这是不正确的。

如果您的类层次结构是多态的(即在您关心的每个基类中至少有一个虚函数),那么您可以在运行时直接使用dynamic_cast并检查它是否成功,但这是相对的昂贵的操作。相比之下,静态强制转换根本不会产生任何运行时成本。