我的问题最好用一个例子来解释。
例如,我有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调用重写函数,而不是它自己的函数定义?
答案 0 :(得分:18)
您不应该从构造函数中调用虚方法,因为该对象尚未完全构造。从本质上讲,派生类尚不存在,因此无法调用其方法。
答案 1 :(得分:0)
在大多数语言中,这种行为是禁止的或未定义的,有充分的理由。
考虑这一点:基类构造函数在子类构造函数之前运行,因此子类定义的任何变量都将是未初始化的。你确定要在这种情况下调用子类方法吗?
最简单的替代方法是在超类中定义initialize()方法,然后记住从子类构造函数中调用initialize()。