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

《深度探索 C++ 物件模型》讀書筆記(5):虛函數、繼承體系下的建構/解構與虛繼承

     編輯:關於C++

純虛擬函數設計原則

  • 解構子**不可**宣告為 pure virtual (需定義,否則衍生類解構子無法串聯呼叫)。
  • 非型別相關操作勿設為 virtual (不會被覆寫)。
  • 可能修改資料成員的函數勿設為 const。

無繼承時的建構

引入 virtual function 後,編譯器在建構子插入 vptr 初始化,copy ctor/operator= 也需處理 vptr,不再是單純位元複製。

繼承體系下的建構

虛繼承菱形結構:

class Point3d : virtual public Point { ... };
class Vertex : virtual public Point { ... };
class Vertex3d : public Point3d, public Vertex { ... };

Vertex3d 建構子傳遞 _most_derived=false 給基類建構子,抑制 Point3d/Vertex 對 Point 的重複建構,由最衍生類 Vertex3d 統一建構虛基類。

vptr 初始化時機

  1. 虛基類建構子
  2. 直接基類建構子
  3. 初始化 vptr 指向正確虛表
  4. 成員物件建構子
  5. 使用者程式碼

確保建構期間呼叫虛函數能正確解析。

虛基類複製問題

虛基類會導致子物件重複複製,至今無完美解。建議:虛基類**不宣告資料**、禁止複製操作。

解構順序

與建構順序完全相反。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved