也许我错了,但这似乎是一个非常基本的问题.突然间,我的继承链停止了工作.编写一个小的基本测试应用程序证明我错了(所以我不能责怪编译器).
我有一个基类,在虚函数中具有默认行为.子类派生自那个并改变行为.
#includeclass Base { public: Base() { print(); } ~Base() {} protected: virtual void print() { std::cout << "base\n"; } }; class Child : public Base { public: Child() {} ~Child() {} protected: virtual void print() { std::cout << "child\n"; } }; int main() { Base b; Child c; }
这打印:
base base
创建Child实例时,为什么调用Base :: print()?我认为通过使用virtual关键字,可以替换派生类的函数.
在什么时候我让自己感到困惑?
您正在构造函数中调用一个虚拟方法,该方法不起作用,因为子类尚未完全初始化.
另请参阅此StackOverflow问题.