【问题标题】:Calling a subclass function which does not exist on superclass [duplicate]调用超类上不存在的子类函数[重复]
【发布时间】:2014-11-19 21:30:28
【问题描述】:

假设我有一个类 Person 和它的子类 Boy。我想在 Boy 中包含 Person 没有 的方法,并且能够通过以下方式通过多态性使用:

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

personP->boyFunction();

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

假设我想拥有多个不同的 Person 子类,每个子类都有自己独有的功能,那么如何巧妙而安全地完成这项工作?

【问题讨论】:

  • Read this。你不能“整齐而安全地”违反法律,根本没有这样的选择。
  • 如果每个函数都是自己独有的,为什么不使用普通的旧多态和虚函数呢? class Person {public: virtual void Foo()=0;};, class Boy {public: virtual void Foo();};, class Girl {public: virtual void Foo();};

标签: c++ inheritance polymorphism


【解决方案1】:

你有选择。这取决于您要致电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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-27
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多