簡體   English   中英

在運行時更新。 (從基類變形為派生類)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM