考虑具有虚函数的基类,父类继承此基类并实现该函数。假设继承父类的子类具有相同定义的函数,它是否覆盖?
此外,我试图以这样的方式实现功能:基类具有虚函数,父类继承基类但不实现它,但继承自父类的子类实现它。 这是允许的吗?
答案 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”关系。说“每个孩子都是父母”是否有意义?显然没有!从这个意义上讲,调用继承到“父”的基类“子”会更有意义(听起来很奇怪,没有?),因为每个父母都是一个孩子。因此,无论哪种方式都有缺陷。我不会开始与风车作斗争,但我可以尝试传播这个想法。我的建议是不要把它们称为“孩子”/“父母”,而只是坚持“基础”和“子类”,这更不容易混淆。