如果我有:
struct Base
{
};
struct Derived : Base
{
};
我在main中创建Derived:
Derived* d = new Derived;
在哪里(在堆上或堆栈上)是我的基础创建的?我是否正确地推断Base是Derived的一部分,因此它是在创建Derived的地方创建的?或者它以其他方式工作?
答案 0 :(得分:5)
基类贡献通常是派生对象的一部分(因此使用对象内存的一部分以及派生部分)。但是,您的示例可能会使此无关紧要,因为基类部分由于C ++空基类优化而占用零内存。
尽管派生结构也是空的,但最终对象的大小必须至少为一个字节,因为所有对象都必须占用空间,以确保两个不同对象的地址不同。有关详细信息,请参阅:Why is the size of an empty class not zero?。
答案 1 :(得分:2)
Base与Derived在同一内存段中创建。在您的示例中,由于您在堆上分配Derived,因此Base也在堆上分配。它们在记忆中形成一个连续的对象。