【发布时间】:2018-01-08 18:09:27
【问题描述】:
class A {
public:
A() { foo(); }
~A() { foo(); }
void foo() { cout << 3; }
void bar() { foo(); }
};
class B : public A {
void foo() { cout << 2; }
};
int main() {
B b;
b.bar();
return 0 ;
}
我编译并运行了它。结果是 333 ...但我想:当我打电话时 b.bar() 。它将直接到 bar() 然后调用 B 类中的 foo() 函数,因为 A 类中的 foo() 在 B 类中被覆盖。我认为的结果是 323 。但是我错了。我错过了什么吗?请帮我解释一下它是如何工作的@
【问题讨论】:
-
我想你想要一个
virtual foo() -
我的两分钱在这里:1)即使您将 foo() 实现为虚函数,一旦在“A”构造函数中调用,它将运行 A::foo() 而不是 B::foo( ) 因为还没有创建“B”; 2)你不能在析构函数中调用任何虚函数,因为“B”可能已经被销毁并且取消引用 B::foo() 指针可能会使应用程序崩溃,或者处理已经覆盖的内存,或者其他什么。在这里我们还没有讨论虚拟继承,它会让事情变得更加棘手。
标签: c++ inheritance polymorphism