在没有对象切片的情况下将派生对象分配给基础 class 对象

Assigning a derived object to a base class object without object slicing

如何在没有堆分配的情况下将派生对象分配给静态类型的基?

基本上,我想知道这是否可能:

Base* b = new Derived;

但没有新指针和原始指针。

您不能在不切片的情况下按值将 Derived 对象分配给 Base 变量 - Base 变量不是 'big enough' 来保存 [=15] 的对象=] 类型。想一想你仍然需要那些 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 对象分配足够的空间,并且你必须确保它存在足够长的时间,所以你不会在原始 [=15= 之后访问你的 Base 对象]被摧毁。