2015-08-14 234 views

回答

2

您不能分配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销毁后不访问您的物体。

+0

不要忘记对齐问题。 – curiousguy

相关问题