我的问题可能会通过一个示例最好地解释。

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

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()。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top