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

C++ 向上轉型詳解:派生類向基類賦值的三種形式與記憶體佈局真相

     編輯:C++ 基礎

向上轉型核心概念

向上轉型:將派生類物件/指針/引用賦值給基類物件/指針/引用。方向:派生 → 基(繼承圖向上)。安全、隱式、編譯器自動完成。

對應向下轉型:基 → 派,有風險,需顯式 dynamic_cast(後續章節)。

形式一:物件賦值(物件切片 Object Slicing)

class A { int m_a; };
class B : public A { int m_b; };

A a(10);
B b(66, 99);
a = b;  // 向上轉型:派生物件賦值給基類物件

運行結果分析

賦值前: A: m_a=10 | B: m_a=66, m_b=99
賦值後: A: m_a=66 | B: m_a=66, m_b=99

關鍵真相:物件切片

  • 僅拷貝基類部分成員(m_a),切掉派生類新增成員(m_b)
  • 成員函數不受影響:a.display() 仍調用 A::display()
  • this 指針不變:仍指向 a 自身
  • 不可逆:基類物件無法賦值給派生類(缺少成員資料)

形式二:指針賦值(無切片,但有陷阱)

A* pa = new A(1);
B* pb = new B(2, 20);
D* pd = new D(4, 40, 400, 4000);  // 多繼承:D : B, C

pa = pd;  // D* → A*
pb = pd;  // D* → B*
pc = pd;  // D* → C* (第二基類)

關鍵現象 1:成員函數仍按靜態類型調用

pa->display()  // 輸出 A 版本,雖指向 D 物件
pb->display()  // 輸出 B 版本
pc->display()  // 輸出 C 版本

原因:非虛函數調用由指針靜態類型決定,非指向物件。

關鍵現象 2:多繼承下指針值可能改變

pa = 0x9b17f8
pb = 0x9b17f8
pc = 0x9b1800  // 不同於 pd!
pd = 0x9b17f8

原因:多繼承物件佈局中,第二/後續基類子物件偏移非零。D* → C* 需調整指針地址(this 指針調整)。

形式三:引用賦值(本質同指針)

D d(4, 40, 400, 4000);
A& ra = d;
B& rb = d;
C& rc = d;

ra.display();  // A 版本
rb.display();  // B 版本
rc.display();  // C 版本

引用無法重新綁定,需分別定義。行為與指針一致:成員變數訪問動態,非虛函數靜態綁定。

記憶體佈局深度解析(多繼承)

D 物件佈局 (假設無虛繼承):
+------------------+  ← pd, pa, pb (地址相同)
| A 部分 (m_a)     |
+------------------+
| B 部分 (m_b)     |
+------------------+  ← pb 實際指向此處
| C 部分 (m_c)     |  ← pc 指向此處 (偏移量 > 0)
+------------------+
| D 部分 (m_d)     |
+------------------+

D* → A*/B*:地址不變(首基類優化)
D* → C*:地址 + 偏移量(編譯器自動調整)

向上轉型後的訪問限制

通過基類物件/指針/引用只能訪問基類成員(含繼承而來),無法直接訪問派生類新增成員。需向下轉型(dynamic_cast)恢復完整訪問。

總結對比表

形式切片指針調整函數綁定用途
物件賦值是 (切掉派生成員)N/A靜態 (基類版本)值語義複製基類部分
指針賦值否多繼承時可能 (非首基類)非虛靜態/虛動態多態、異構容器
引用賦值否同指針同指針多態參數傳遞

核心心法

  1. 物件賦值 = 切片:僅複製基類部分,失去派生特性
  2. 指針/引用 = 多態載體:保留完整物件,配合虛函數實現動態分發
  3. 多繼承指針調整:編譯器自動處理,但影響指針比較與 static_cast
  4. 向上安全,向下謹慎:向下轉型需 RTTI 與 dynamic_cast
  1. 上一篇文章:
  2. 下一篇文章:
  • --热点文章
  • Copyright © 程式碼之家 All Rights Reserved