使用虚函数继承

时间:2016-06-24 23:04:03

标签: c++ class inheritance virtual-functions

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

此外,我试图以这样的方式实现功能:基类具有虚函数,父类继承基类但不实现它,但继承自父类的子类实现它。 这是允许的吗?

1 个答案:

答案 0 :(得分: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”关系。说“每个孩子都是父母”是否有意义?显然没有!从这个意义上讲,调用继承到“父”的基类“子”会更有意义(听起来很奇怪,没有?),因为每个父母都是一个孩子。因此,无论哪种方式都有缺陷。我不会开始与风车作斗争,但我可以尝试传播这个想法。我的建议是不要把它们称为“孩子”/“父母”,而只是坚持“基础”和“子类”,这更不容易混淆。

相关问题