6

我的问题可能最好用一个例子来解释。

例如,我有 2 个类:一个基类和一个派生类:

class baseClass
{
public:
    baseClass()
    {
        foo();
    }
    virtual bool foo() { printf("baseClass"); return false;}

};

class derivedClass : public baseClass
{
public:
    bool foo()
    {
        printf("derivedClass");
        return true;
    }

};

当我创建 的实例时,将调用derivedClassin 的构造函数,并将从它的构造函数中调用。问题是,基类的构造函数正在调用它自己的构造函数,并且没有被派生类重写的重写。无论如何让 baseClass 调用被覆盖的函数,而不是它自己的函数定义?baseClassfoo()foo()foo()

4

2 回答 2

18

您不应该从构造函数调用虚方法,因为该对象尚未完全构造。本质上,派生类还不存在,所以它的方法不能被调用。

于 2010-11-01T21:30:51.757 回答
0

在大多数语言中,这种行为要么是被禁止的,要么是未定义的,这是有充分理由的。

考虑一下:基类构造函数在子类构造函数之前运行,因此子类定义的任何变量都将未初始化。您确定要在这种情况下调用子类方法吗?

最简单的替代方法是在你的超类中定义一个 initialize() 方法,然后记住从你的子类构造函数中调用 initialize()。

于 2010-11-01T21:48:57.023 回答