【发布时间】:2015-11-07 06:10:07
【问题描述】:
如何在不分配堆的情况下将派生对象分配给静态类型的基类?
基本上,我想知道这是否可能:
Base* b = new Derived;
但没有新的和原始的指针。
【问题讨论】:
-
Base&& b = Derived{};会起作用,尽管它确实让我想知道你为什么首先需要它。
标签: c++ inheritance virtual-inheritance
如何在不分配堆的情况下将派生对象分配给静态类型的基类?
基本上,我想知道这是否可能:
Base* b = new Derived;
但没有新的和原始的指针。
【问题讨论】:
Base&& b = Derived{}; 会起作用,尽管它确实让我想知道你为什么首先需要它。
标签: c++ inheritance virtual-inheritance
如果不进行切片,您不能将 Derived 对象按值分配给 Base 变量 - Base 变量只是不够“大”,无法容纳 Derived 类型的对象。想想看,你仍然需要那些 sizeof(Derived) 字节的内存来保存一个实际的对象。
但是,您可以避免堆分配。
将其分配为自动变量:
Derived d;
Base* b = &d;
或者作为静态变量:
static Derived d;
Base* b = &d;
或作为全局:
//Somewhere in global scope
Derived d;
//...somewhere in function
Base* b = &d;
甚至在预分配内存上使用placement new(免责声明:不要使用这个实际代码):
static char memory[sizeof(Derived)];
Base* b = new(memory)Derived;
最后,原始指针可以通过引用来避免,但是在初始化之后你就失去了改变它的能力:
Derived d;
Base& b = d;
无论哪种方式,您都必须为Derived对象分配足够的空间,并且您必须确保它存在足够长的时间,这样您就不会在原始Derived被销毁后访问您的Base对象。
【讨论】: