虚函数继承
Inheritance with Virtual function
考虑一个基 class 有一个虚函数,父 class 继承这个基 class 并实现那个函数。假设子 class 继承父 class 具有具有相同定义的函数,它会覆盖吗?
此外,我正在尝试以这样的方式实现功能,即基 class 具有虚函数,父 class 继承基 class 但不实现它,但子class 从父 class 继承实现它。
这允许吗?
关于简短的回答,请参阅 πìντα ῥεῖ 的评论。
Consider a base class having a virtual function and parent class inherits this base class and implements that function. Say if a child class inheriting parent class has a function with same definition , does it override?
我对你对基数的用法有点困惑,parent 和 child,但如果我只是按字面意思理解(除了 "same definition",我将其解释为 "same signature",我假设你的意思是基础中的纯虚拟)并将其翻译成如下代码:
#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"
}
在 subclass 中,方法不必再次声明为 virtual
即可使其成为 virtual
。我几乎是一个 pre-C++11 的人,但我知道有一个 override
标识符可以帮助确保方法实际上覆盖了某些东西。你会像这样使用它:
struct child : parent {
void foo() override { cout << "child" << endl; }
};
如果 child::foo
不覆盖这将导致编译器错误。
Also, I am trying to implement features in such a way that base class has a virtual function and parent class inherits base class but does not implement it but the child class inheriting from parent class implements it. Is this allowed?
我再次将 "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
继承了它所有的基础 classes 方法。唯一要考虑的是,如果 class 继承自抽象 class 并且没有实现所有抽象(=纯虚拟)方法,它也是一个抽象 class (即你不能创建objects 这个 class).
PS:我希望我正确理解了这个问题,并且我不会因为回答这样一个基本问题而被激怒。请注意,您可以使用一些代码轻松地自行检查这些内容。继承问题很少依赖于编译器,它有助于理解正在发生的事情。此外,override
是一个非常酷的新功能,可以毫无疑问地确定方法是否真的被覆盖了。
PPS:作为旁注,恕我直言,child - parent 类比是最糟糕的类比之一。实际上,一旦 child 将其基因遗传给 child,它就会变成 parent。另一方面 (public) 继承模型 "is-a" 关系。说 "every child is-a parent" 有意义吗?显然不是!从这个意义上说,调用继承到 "parent" 的基 class "child" 会更有意义(听起来很奇怪,不是吗?),因为每个 parent is-a child。因此,无论哪种方式,类比都是有缺陷的。我不会开始反对风车,但我可以尝试传播这个想法。我的建议是根本不要称它们为 "child" / "parent",而是坚持使用 "base" 和 "subclass",这样就不会造成混淆。
考虑一个基 class 有一个虚函数,父 class 继承这个基 class 并实现那个函数。假设子 class 继承父 class 具有具有相同定义的函数,它会覆盖吗?
此外,我正在尝试以这样的方式实现功能,即基 class 具有虚函数,父 class 继承基 class 但不实现它,但子class 从父 class 继承实现它。 这允许吗?
关于简短的回答,请参阅 πìντα ῥεῖ 的评论。
Consider a base class having a virtual function and parent class inherits this base class and implements that function. Say if a child class inheriting parent class has a function with same definition , does it override?
我对你对基数的用法有点困惑,parent 和 child,但如果我只是按字面意思理解(除了 "same definition",我将其解释为 "same signature",我假设你的意思是基础中的纯虚拟)并将其翻译成如下代码:
#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"
}
在 subclass 中,方法不必再次声明为 virtual
即可使其成为 virtual
。我几乎是一个 pre-C++11 的人,但我知道有一个 override
标识符可以帮助确保方法实际上覆盖了某些东西。你会像这样使用它:
struct child : parent {
void foo() override { cout << "child" << endl; }
};
如果 child::foo
不覆盖这将导致编译器错误。
Also, I am trying to implement features in such a way that base class has a virtual function and parent class inherits base class but does not implement it but the child class inheriting from parent class implements it. Is this allowed?
我再次将 "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
继承了它所有的基础 classes 方法。唯一要考虑的是,如果 class 继承自抽象 class 并且没有实现所有抽象(=纯虚拟)方法,它也是一个抽象 class (即你不能创建objects 这个 class).
PS:我希望我正确理解了这个问题,并且我不会因为回答这样一个基本问题而被激怒。请注意,您可以使用一些代码轻松地自行检查这些内容。继承问题很少依赖于编译器,它有助于理解正在发生的事情。此外,override
是一个非常酷的新功能,可以毫无疑问地确定方法是否真的被覆盖了。
PPS:作为旁注,恕我直言,child - parent 类比是最糟糕的类比之一。实际上,一旦 child 将其基因遗传给 child,它就会变成 parent。另一方面 (public) 继承模型 "is-a" 关系。说 "every child is-a parent" 有意义吗?显然不是!从这个意义上说,调用继承到 "parent" 的基 class "child" 会更有意义(听起来很奇怪,不是吗?),因为每个 parent is-a child。因此,无论哪种方式,类比都是有缺陷的。我不会开始反对风车,但我可以尝试传播这个想法。我的建议是根本不要称它们为 "child" / "parent",而是坚持使用 "base" 和 "subclass",这样就不会造成混淆。