Cpp 物件模型探索 不能被繼承的類

2021-10-01 19:13:15 字數 436 閱讀 4375

兩種方法

c++ 11 final 關鍵字

友元類 + 虛繼承。

栗子

class a

friend class b;

};class b : virtual public a

;

我們的目的是讓 b 成為乙個不能被繼承的類。分析**,由於 b 是 a 的友元,所以即使 a 的建構函式是私有的,b也是可以呼叫的,所以 b 繼承 a 這個關係是成立的。

關鍵來了,由於 b 是虛繼承 a,這就導致了如果 c 類想繼承 b,則 c 類必須首先呼叫 a 類的建構函式(詳情),而 a 類的建構函式是私有的,所以 c 類不能呼叫 a 類的建構函式,所以,b 類是不可繼承的。總結

使用時盡量使用方案 1,因為方案 2 是以犧牲效能、破壞類的封裝性為代價的。

(saw:game over!)

Cpp 物件模型探索 多重繼承虛函式表分析

include class base1 virtual void func12 virtual void func13 virtual void func14 class base2 virtual void func22 virtual void func23 class son public b...

Cpp 物件模型探索 物件訪問成員變數的原理

1 原始碼 include include class base public int bi class a public base public virtual void func public int i int main 2 結果 base 的 this 指標 004ff9b4 a 的 thi...

不能被繼承的類

不能被繼承的類,就是子類在呼叫父類的建構函式的時候失敗就沒法被整合了,所以可以把析構函式定義為private,因為在呼叫建構函式的時候,會先檢查析構函式,如果析構是private的,那麼建構函式也沒法被呼叫。這個問題和另一篇文章類似我們通過設定共有的static函式來構造和析構。class a a ...