在没有对象切片的情况下将派生对象分配给基础 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
对象]被摧毁。
如何在没有堆分配的情况下将派生对象分配给静态类型的基?
基本上,我想知道这是否可能:
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
对象]被摧毁。