[英]upcast at runtime. (Morph from Base Class to derive Class)
class B{
private:
int a;
}
class D: public B{
private:
int b;
}
B* b = new B;
現在由於某種原因,我想將 b
變成 D*
類型的對象。 例如保留 B的信息,並在需要附加信息的情況下成為 D。
我目前在想的是。 static_cast進行向上轉換。 其他屬性將設置為null或垃圾。 然后手動分配其他屬性。 但這導致懸空的指針風險。 如果沒有足夠謹慎地編碼副本構造函數。
那么還有什么合適的解決方案呢?
如果我們從PHP的角度來看,那么拼圖的解決方案有什么解決方案嗎?
如果執行static_cast<>
則其他屬性將不會為null或垃圾,它們實際上將在為對象分配的內存之外 。 使用dynamic_cast<>
,如果變量不包含正確的類型,則將失敗。
同樣,在這種情況下,C ++和PHP之間的相似性只是膚淺的。 不要使用它來進一步“了解” C ++代碼。
b指向類型B的對象。它不能成為D。如果想要D,則必須分配一個並復制* b中的字段。
除非您使用PHP編寫東西,否則切勿從PHP角度考慮問題。 切勿在PHP中編寫任何內容。
通常無法將基礎對象重建為派生對象。 首先,分配只為B分配了足夠的空間,而沒有為D分配足夠的空間。如果您為D分配了足夠的空間來創建B對象(您目前沒有,而且還是很難做到),那么您可以使用黑客來“重建”這樣的對象:
// EXTREME HACK, BE CAREFUL, AND USE WITH CARE
// IF YOU DON'T UNDERSTAND IT, DON'T USE IT.
// you should have allocated (sizeof (D)) space to your b pointer.
D* d_object = new (b) D(B(*b));
// you should consider any previous pointer pointing toward the old B* as dangling.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.