C ++类在不调用父构造函数的情况下构建和运行

时间:2017-09-11 15:58:25

标签: c++

我发现了一个我无法解释的奇怪情况。我有一个父类和基类。在父类的构造函数中,我定义了一个本地对象(它是一个复杂的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...

2 个答案:

答案 0 :(得分:2)

  
    

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

  

这种工作和编译的原因是因为C ++语言确保初始化层次结构中的对象。在这种情况下,编译器会发现您派生的("孩子"在您的术语中)类没有调用基类(" parent")构造函数...所以编译器会为你做。现在,它只能在基类具有可访问的默认构造函数(不带参数的构造函数)时执行此操作,这也是这种情况。

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

答案 1 :(得分:0)

如果“复杂对象”具有默认构造函数,则无论如何都将初始化。也许你正在使用一个基本上有“垃圾”的变量,这会导致你的问题。