从基类调用重写函数?

时间:2010-11-01 21:28:33

标签: c++ override derived-class

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

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

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

};

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

};

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

2 个答案:

答案 0 :(得分:18)

您不应该从构造函数中调用虚方法,因为该对象尚未完全构造。从本质上讲,派生类尚不存在,因此无法调用其方法。

答案 1 :(得分:0)

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

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

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