构造函数的虚函数调用

时间:2009-02-03 13:23:04

标签: c++ inheritance constructor virtual-functions override

也许我错了,但这似乎是一个非常基本的问题。突然间,我的继承链停止了工作。编写一个小的基本测试应用程序证明我错了(所以我不能责怪编译器)。

我有一个基类,在虚函数中有默认行为。子类派生于此并改变行为。

#include <iostream>

class 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关键字,可以替换派生类的函数。

我在什么时候让自己感到困惑?

3 个答案:

答案 0 :(得分:18)

您正在构造函数中调用虚方法,但由于子类尚未完全初始化,因此无法正常工作。

另见this StackOverflow question

答案 1 :(得分:4)

虽然您当前的问题是来自其他人提到的构造函数的虚方法调用,但我注意到您没有使析构函数成为虚拟。这通常是一件坏事。在你的情况下,析构函数是nops,并且没有成员是具有析构函数的对象,但是如果你的代码发生了变化,那么很容易发生坏事。

答案 2 :(得分:2)

有关详细说明(请勿从ctor / dtor调用虚函数),请参阅this link