创建派生类对象时,首先为哪一个空间分配空间?
是基类构造函数还是派生类构造函数?
答案 0 :(得分:5)
首先,
分配,您要询问的内存预留与初始化不同(执行基本上设置合适值的构造函数)那个记忆),和
正式(我们的神圣标准)和实践中对于大多数派生对象的内存是否需要连续,其中正式定义“内存区域”为可能是非连续的,主要是为了支持多个虚拟继承。
也就是说,在实践中,大多数派生对象是单个连续的内存块,包括所有基类子对象和数据成员子对象的空间,并且此块必须已分配一下子。
初始化(构造函数的调用)在分配后继续。如果通过抛出异常导致初始化失败,new
表达式可以保证解除分配。但是,如果所采用的分配函数具有额外的自定义参数(所谓的“放置新的”)并且没有相应的释放函数可用,则该保证无效,例如,例如在Microsoft的MFC类框架的早期版本中进行调试构建(这很讽刺:初始化失败的程序只会在调试版本中泄漏内存...)。
答案 1 :(得分:1)
派生对象的空间包含所有派生成员和所有基本成员。派生对象只有一个分配,分配的内存保存对象的所有部分。
答案 2 :(得分:-1)
如评论中所述,它是Base类。从逻辑上讲,由于您可以访问Derived类(包括构造函数)中的基本公共成员和受保护成员,因此需要先分配它。尝试从以下代码开始并玩游戏。
#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;
}