【发布时间】:2021-05-04 18:09:09
【问题描述】:
我有一个使用继承的非常简单的代码,并且在我的基类和派生类中有相同的函数原型。我不明白最后一个结果(pB->bar()),因为我认为由于pB 指向派生类型对象(在delete 之后)它应该调用D::bar()。
#include <iostream>
class B {
public:
virtual void foo() { std::cout << "B:foo" << std::endl; }
void bar() { std::cout << "B:bar" << std::endl; }
};
class D : public B {
public:
virtual void foo() override { std::cout << "D:foo" << std::endl; }
void bar(){ std::cout << "D:bar" << std::endl;}
};
int main() {
B* pB = new B;
pB->foo();
pB->bar();
delete pB;
pB = new D;
pB->foo();
pB->bar();
delete pB;
}
这样做的结果是:
B:foo
B:bar
D:foo
B:bar
【问题讨论】:
-
您认为
virtual关键字究竟是干什么用的? -
如果您想了解更多关于它的行为方式以及
virtual关键字如何影响为方法分派生成的程序集的更多信息,您应该探索一个有趣的主题是 vtable 查找。
标签: c++ inheritance