如何将派生对象分配给基类的静态类型并且不使用堆分配?将派生对象分配给基类对象而不进行对象分片
基本上,我想知道这是可能的:
Base* b = new Derived;
但是,如果没有新的和原始指针。
如何将派生对象分配给基类的静态类型并且不使用堆分配?将派生对象分配给基类对象而不进行对象分片
基本上,我想知道这是可能的:
Base* b = new Derived;
但是,如果没有新的和原始指针。
您不能分配Derived
对象Base
变量的值,而不切片 - Base
变量是不“足够大”召开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
销毁后不访问您的物体。
不要忘记对齐问题。 – curiousguy
'Base && b = Derived {};'会工作,虽然它确实让我想知道为什么你首先需要这个。 – user657267