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

标签 c++

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

相关文章:

c++ - 具有 move 操作和右值转发的对象生命周期

c++ - 无法在 QSplitter (Qt) 中交换小部件

c++ - 将指向模板函数的指针作为函数参数传递?

c++ - 专门化类模板构造函数

c++ - 链接后的最小可执行文件大小

c++ - WH_SHELL 的问题

c++ - 用于多维数据访问的 overload() 运算符

c++ - 错误 LNK 2005 Visual Studio 2008

c++ - 需要 1 个千兆 NIC 卡的精确带宽公式

c++ - VS2012使用3D模型的困境