虚函数继承

Inheritance with Virtual function

本文关键字:继承 函数      更新时间:2023-10-16

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

另外,我正试图实现这样一种方式的功能,基类有一个虚拟函数和父类继承基类,但不实现它,但从父类继承的子类实现它。允许这样做吗?

关于简短的答案,请看π α ντα ρ ε ω的注释。

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

我对基,父和子的使用有点困惑,但如果我只是从字面上理解它(除了"相同定义",我解释为"相同签名",我假设你的意思是基中的纯虚拟)并将其翻译成代码,它看起来像这样:

#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。我几乎是一个pre- c++ 11家伙,但我知道有一个override标识符,可以帮助确保一个方法实际上是覆盖的东西。你可以这样使用它:

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

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

另外,我正试图实现这样一种方式的功能,基类有一个虚拟函数和父类继承基类,但不实现它,但从父类继承的子类实现它。允许这样做吗?

我再次将"virtual"解释为"pure virtual"(否则我不明白这个问题):

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"关系建模。说"每个孩子都是父母"有意义吗?显然没有!从这个意义上说,将继承"父类"的基类称为"子"更有意义(听起来很奇怪,不是吗?),因为每个父类都是一个子类。因此,无论哪种类比都是有缺陷的。我不会发起一场反对风车的斗争,但我可以试着传播这个想法。我的建议是不要称它们为"子"/"父",而只是坚持使用"基"answers"子类",这样更容易混淆。