【问题标题】:Inheritance with Virtual function用虚函数继承
【发布时间】:2016-06-24 23:04:03
【问题描述】:

考虑一个具有虚函数的基类,父类继承该基类并实现该函数。说如果继承父类的子类有一个定义相同的函数,它会覆盖吗?

另外,我正在尝试以这样一种方式实现功能,即基类具有虚函数,父类继承基类但不实现它,但从父类继承的子类实现它。 这允许吗?

【问题讨论】:

  • 是的,是的.......

标签: c++ class inheritance virtual-functions


【解决方案1】:

有关简短答案,请参阅 πάντα ῥεῖ 的评论。

考虑一个具有虚函数的基类,父类继承该基类并实现该函数。假设继承父类的子类具有相同定义的函数,是否覆盖?

我对您对 base、parent 和 child 的使用感到有些困惑,但如果我只是按字面意思理解(除了“相同定义”,我将其解释为“相同签名”并且我假设您的意思是基础中的纯虚拟) 并将其翻译成如下所示的代码:

#include <iostream>
using std::cout;
using std::endl;

struct base { virtual void foo() = 0;    };

struct parent : base { void foo() { cout << "parent" << endl; } };

struct child : parent { void foo() { cout << "child" << endl; } };

int main() {
    child c;
    c.foo();  // prints "child"
}

在子类中,方法不必再次声明为virtual 以使其成为virtual。我几乎是 C++11 之前的人,但我知道有一个 override 标识符可以帮助确保方法实际上覆盖了某些东西。你可以这样使用它:

struct child : parent { 
    void foo() override { cout << "child" << endl; } 
};

如果child::foo 不覆盖这将导致编译器错误。

另外,我正在尝试以这样一种方式实现功能,即基类具有虚函数,父类继承基类但不实现它,但从父类继承的子类实现它。这允许吗?

我再次将“虚拟”解释为“纯虚拟”(否则我不明白这个问题):

struct base { virtual void foo() = 0;    };

struct parent : base { };

struct child : parent { void foo() { cout << "child" << endl; } };

int main() {
    child c;
    c.foo();     // prints "child"
    // parent p; // not OK
}

这是允许的,因为child 继承了它的所有基类方法。唯一需要考虑的是,如果一个类继承自抽象类并且没有实现所有抽象(= 纯虚拟)方法,那么它也是一个抽象类(即您不能创建此类的对象)。

PS:我希望我正确理解了这个问题,并且我不会因为回答这样一个基本问题而被激怒。请注意,您可以通过一些代码轻松地自行检查这些内容。继承问题很少依赖于编译器,它有助于了解正在发生的事情。此外,override 是一个非常酷的新功能,它毫无疑问是否真正覆盖了方法。

PPS:作为旁注,恕我直言,孩子 - 父母的类比是最糟糕的类比之一。实际上,一旦孩子将基因遗传给孩子,孩子就会成为父母。另一方面,(公共)继承对“is-a”关系建模。说“每个孩子都是父母”有意义吗?显然没有!从这个意义上说,将继承给“父”的基类称为“子”会更有意义(听起来很奇怪,不是吗?),因为每个父都是-一个孩子。因此,无论哪种方式,这个类比都是有缺陷的。我不会开始与风车作斗争,但我可以尝试传播这个想法。我的建议是根本不要称它们为“子类”/“父类”,而只是坚持使用“基类”和“子类”,这样就不会那么混乱了。

【讨论】:

    猜你喜欢
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2015-08-23
    • 2015-08-07
    • 2012-08-06
    • 2018-10-09
    相关资源
    最近更新 更多