调用超类上不存在的子类函数

时间:2014-11-19 21:30:28

标签: c++ inheritance polymorphism

假设我有一个Person类,它的子类是Boy。我希望在没有的人的男孩中包含一个方法,并且能够通过以下方式通过多态来使用:

Boy john = Boy();
Person* personP = &john;

personP->boyFunction();

我尝试将Person中的函数声明为virtual和= 0(在头文件中)。问题是我有多个这样的函数,我不希望所有子类都定义所有这些函数。

如果我想拥有多个不同的 Person子类,每个人都拥有一个独有的函数,这样做怎么做得整齐安全呢?

1 个答案:

答案 0 :(得分:0)

你有选择。这取决于你想要调用boyFunction()的具体情况。如果您知道Boy*,那么您应该要求获得Boy*。否则...

最直接:演员(尽管这可能表明设计不佳),如果适用,只调用boyFunction()

Boy* boy = dynamic_cast<Boy*>(personP);
if (boy) {
    boy->boyFunction();
}

不那么直接,污染更严重:

class Person {
   // ...
   virtual void boyFunction() { } // probably not = 0;
}

class Boy : public Person {
   // ...
   void boyFunction() { /* do stuff */ }
};

personP->boyFunction();

您为什么要拨打boyFunction()?也许它是一些更大算法的一部分...所以用更大的动态方法包装你想做的事情:

personP->performSomeFunction();

哪里可能:

void Boy::performSomeFunction() {
    a();
    b();
    boyFunction();
    c();
}

void Doctor::performSomeFunction() {
    doSurgery();
}