C 类构建和运行,而无需调用父构建器

C++ class building and running without calling parent constructor

本文关键字:构建 调用 运行      更新时间:2023-10-16

我发现了一个奇怪的情况,我无法解释。我有父母课程和基础课。在父类的构造函数中,我定义了一个本地对象(这是一个复杂的C设备 - 想想XML解析器和处理器)。然后我创建了一个子类,但是在子类构造函数中,我完全忘了打电话给父构建器。结果是该程序运行,所有情况看起来都很好。孩子课程打电话给所有父级操作,一切似乎都起作用...直到程序崩溃(在内核层面谈论恐慌)。我不确定这是否是坠机的原因,但可能是。

我之所以追求的是试图了解它的工作原理(也许直到一点)。我是如此疯狂地幸运,以至于记忆在本地对象方面排队了吗?

看一下简化的定义,以了解我的意思

// header
class ParentClass
{
    private:
        OtherClass _complexObject;
    protected:
    public:
        ParentClass();
        virtual ~ParentClass();
        virtual void AddData(OtherClass *complexObject);
        virtual void DoStuff();
}
class ChildClass: public ParentClass
{
    private:
    protected:
    public:
        ChildClass();
        virtual ~ChildClass();
}
//source
ParentClass::ParentClass()
{
    _complexObject = create_complex_object();
}
ParentClass::~ParentClass(){}
void ParentClass::AddData(OtherClass *complexObject)
{
    add_data_to_object(complexObject, 12345);
}
void ParentClass::DoStuff()
{
    AddData(_complexObject);
}

BaseClass::BaseClass(){}
BaseClass::~BaseClass(){}
// at some point, BaseClass::DoStuff() is called...

然后我创建了一个子类,但是在子类构造函数中,我完全忘记了称为父构建器。

此作用和编译的原因是因为C 语言可确保层次结构中的对象被初始化。在这种情况下,编译器会发现您的派生(您的术语中的"孩子")不会称呼基础的("父")构造函数...因此编译器为您做。现在,只有当基类具有可访问的默认构造函数(不采用参数的构造函数)时,才能执行此操作,在这里也是如此。

如果您的基类没有默认的构造函数(也就是说,它只有需要参数的构造函数),则编译器不知道该做什么,这是编译错误。

如果"复杂对象"具有默认的构造函数,无论如何都会初始化。也许您正在使用基本上具有"垃圾"的变量,这会导致您出现问题。