如何将派生对象分配给静态类型的base并且没有堆分配?
基本上,我想知道这是否可行:
Base* b = new Derived;
但没有新的和原始的指针。
答案 0 :(得分:4)
您无法按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;
或者作为全球:
static char memory[sizeof(Derived)];
Base* b = new(memory)Derived;
甚至在预分配内存上使用placement new(免责声明:请勿使用此实际代码):
Derived d;
Base& b = d;
最后,使用引用可以避免原始指针,但是在初始化之后你就失去了更改它的能力:
Derived
无论哪种方式,您都必须为Base
对象分配足够的空间,并且必须确保其存活时间足够长,因此在原始Derived
之后您无法访问{{1}}对象破坏。