将派生对象赋值给基类对象而不使用对象切片

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

本文关键字:对象 切片 基类 派生 赋值      更新时间:2023-10-16

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

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

Base* b = new Derived;

你不能在没有切片的情况下将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;

或者甚至在预分配的内存上放置new (免责声明:不要使用这个实际代码):

static char memory[sizeof(Derived)];
Base* b = new(memory)Derived;

最后,原始指针可以通过引用来避免,但是在初始化之后就失去了修改它的能力:

Derived d;
Base& b = d;

无论哪种方式,您都必须为Derived对象分配足够的空间,并且必须确保它存活足够长的时间,因此在原始Derived被销毁后,您不会访问Base对象。