gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:43:32 25 4
gpt4 key购买 nike

我发现了一个我无法解释的奇怪情况。我有一个父类和基类。在父类的构造函数中,我定义了一个本地对象(它是一个复杂的 C 工具——想想一个 XML 解析器和处理器)。然后我创建了一个子类,但是在子类的构造函数中,我完全忘记了调用父类的构造函数。结果是程序运行并且一切正常。子类调用所有父类操作,一切似乎都正常……直到程序可怕地崩溃(在内核级别谈论 panic )。我现在不确定这是否是崩溃的原因,但有可能是。

我所追求的是试图理解它是如何工作的(也许直到某一点)。我是不是太幸运了,以至于内存与本地对象对齐?

看看简化的定义,看看我的意思

// 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...

最佳答案

Then I created a child class, but in the child class constructor, I completely forgot to call the parent constructor.

之所以能正常工作和编译是因为 C++ 语言确保层次结构中的对象被初始化。在这种情况下,编译器会发现您的派生类(您的术语中的“子”)没有调用基类的(“父”)构造函数……因此编译器会为您完成。现在,它只能在基类具有可访问的默认构造函数(不带参数的构造函数)的情况下执行此操作,这里也是这种情况。

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

关于C++ 类在不调用父构造函数的情况下构建和运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46159794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com