题
我的问题可能会通过一个示例最好地解释。
例如,我有两个类:一个基类和一个派生类:
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()
将从其构造函数中调用。问题是,基督的构造函数正在自行呼唤 foo()
没有被覆盖的 foo()
派生的班级已覆盖。无论如何,是否可以将基本级别称为“覆盖功能”,而不是自己对函数的定义?
解决方案
您不应从构造函数中调用虚拟方法,因为该对象尚未完全构造。本质上,派生类还不存在,因此无法调用其方法。
其他提示
在大多数语言中,这种行为是禁止的,要么是不确定的,这是有充分理由的。
考虑一下:基类构造函数是在子类构造函数之前运行的,因此Sublass定义的任何VAR都将是非初始化的。您确定在这种情况下要调用子分类方法吗?
最简单的替代方法是在超类中定义一个初始化方法,然后记住要从子类构造函数调用initialize()。
不隶属于 StackOverflow