如何將派生對象分配給基類的靜態類型並且不使用堆分配?將派生對象分配給基類對象而不進行對象分片
基本上,我想知道這是可能的:
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