我发现了一个我无法解释的奇怪情况。我有一个父类和基类。在父类的构造函数中,我定义了一个本地对象(它是一个复杂的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...
答案 0 :(得分:2)
然后我创建了一个子类,但在子类构造函数中,我完全忘记调用父构造函数。
这种工作和编译的原因是因为C ++语言确保初始化层次结构中的对象。在这种情况下,编译器会发现您派生的("孩子"在您的术语中)类没有调用基类(" parent")构造函数...所以编译器会为你做。现在,它只能在基类具有可访问的默认构造函数(不带参数的构造函数)时执行此操作,这也是这种情况。
如果您的基类没有默认构造函数(也就是说,它只有需要参数的构造函数),编译器就不知道该怎么做了它自己的这将是一个编译错误。
答案 1 :(得分:0)
如果“复杂对象”具有默认构造函数,则无论如何都将初始化。也许你正在使用一个基本上有“垃圾”的变量,这会导致你的问题。