2

创建派生类对象时首先为哪个分配空间?

是基类构造函数还是派生类构造函数?

4

3 回答 3

5

第一的,

  • allocation,您要询问的内存预留,与初始化不同并且在初始化之前(执行基本上在该内存中设置合适值的构造函数),并且

  • 形式(我们的神圣标准)和实践中的差异在于最派生对象的内存是否需要是连续的,形式将“内存区域”定义为可能不连续,主要是为了支持多重虚拟继承.

也就是说,实际上,最派生的对象是单个连续的内存块,其中包括所有基类子对象和数据成员子对象的空间,并且这个块必须一次全部分配。

初始化(构造函数的调用)在分配之后进行。如果new初始化因抛出异常而失败,则表达式保证释放。但是,如果使用的分配函数具有额外的自定义参数(所谓的“新放置”)并且没有相应的释放函数可用,则此保证无效,例如 Microsoft 的 MFC 类框架的早期版本中的调试构建(这很讽刺:一个初始化失败的程序只会在调试版本中泄漏内存……)。

于 2012-08-22T00:45:06.100 回答
1

派生对象的空间包含所有派生成员和所有基础成员。派生对象只有一次分配,分配的内存保存对象的所有部分。

于 2012-08-22T00:36:33.040 回答
-1

如评论中所述,它是 Base 类。从逻辑上讲,由于您可以访问派生类(包括构造函数)中的基本公共和受保护成员,因此需要首先分配它。尝试从以下代码开始并尝试一下。

#include <iostream>

class Base
{
    public:
    Base() {std::cout<<"Base CTOR" << std::endl;}
};

class Derived : public Base
{
    public:
    Derived():Base() {std::cout<<"Derived CTOR"<<std::endl;}
};

int main(int argc, char* argv[])
{
    Derived d;
}
于 2012-08-22T00:34:56.407 回答