2015-08-14 152 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

相關問題