首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 對象佈局與多態實現:動態轉換與強制轉換的區別

     編輯:關於C++

動態轉換調整指針位置

使用 dynamic_cast 進行向上/向下轉換時,編譯器自動調整指針位置以指向正確的子對象:

C051 obj;
C041 * pt1 = dynamic_cast<C041*>(&obj); // 無調整
C042 * pt2 = dynamic_cast<C042*>(&obj); // 需調整至第二個 vptr

匯編顯示 pt2 賦值涉及:檢查源指針非空 → 讀取偏移值指針 → 計算新地址。而普通指針賦值僅兩條指令。動態轉換保證多態語義正確,但有運行期開銷。

對象強制轉換產生臨時對象(切片)

C082 c082;
C041 temp = (C041)c082; // 編譯器生成臨時 C041 對象

輸出證明:

  • 臨時對象地址與原對象不同。
  • 臨時對象的 vptr 指向 C041 虛表,而非 C082 的虛表。
  • 基類部分數據成員(如 c_)被複製到臨時對象。

原因:對象轉換不需保持多態,編譯器寧可創建新對象並複製數據,也不修改虛表條目(太複雜)。

危險示例

((C041)c082).somefun(); // 若 somefun 修改狀態,僅影響臨時對象,原對象不變

正確做法:obj.C010::foo(); 顯式調用基類版本,作用於原對象。

單例模式陷阱

若基類構造函數為 protected,向上轉型創建臨時對象會導致編譯錯誤(無法構造基類)。

核心區別

轉換類型指針動態轉換對象強制轉換
機制調整指針位置創建臨時對象並複製數據
多態性保持丟失(切片)
開銷指針運算構造/析構 + 複製
安全性dynamic_cast 可檢查無檢查,隱式切片
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved