C 虛函式表的繼承問題總結

2021-10-04 18:42:18 字數 1363 閱讀 8706

**結論:**當父類定義了虛函式時,在子類進行繼承的時候會將父類的虛函式表也給繼承下來所以那一些虛函式在子類中也是virtual型別的,如果要對父類中的虛函式進行重寫時或新增虛函式,順序是:(圖表說明為圖一)

①先將父類的虛函式列表複製過來

②重寫虛函式時是把從父類繼承過來的虛函式表中對應的虛函式進行相應的替換。

③如果子類自己要新增自己的虛函式,則是把新增的虛函式加到從父類繼承過來虛函式表的尾部。

圖一?在這補充幾個點:

第一點:嚴格說是同一的類的不同物件都有自己的虛函式表,只是指向相同的虛函式,共用的~

第二點:子類和父類中的虛函式表中沒重寫的虛函式也是共用的

son類繼承自father和mother類

#include

using

namespace std;

class

father

virtual

void

func2()

virtual

void

func3()

void

func4()

public

:int x =

200;

int y =

300;

static

int z;};

class

mother

virtual

void

handle2()

virtual

void

handle3()

public

://為了便於測試,使用public許可權 int m = 400;

int n =

500;};

class

son:

public father,

public mother

virtual

void

handle1()

virtual

void

func5()

};

利用虛函式指標可以觀察到son類物件的記憶體分布情況,關於一些對於指標的呼叫在提到了,有興趣的可以看看。

*結論:會有兩個虛函式指標分別指向father類中的虛函式表,以及mother類中的虛函式表(可以理解為有繼承自幾個不同物件就有多少個虛函式指標)。*?(見下圖)

通過vs觀察的記憶體分布情況為?

虛繼承與虛函式表

一 虛繼承 1 include iostream using namespace std class bvoid fb class d1 virtual public bvoid fd1 class d2 virtual public bvirtual void vd2 void fd2 class...

虛函式,虛繼承與虛函式表

c 實現多型機制 模板技術,rtti 技術,虛函式技術,要麼是試圖做到在編譯時決議,要麼試圖做到執行時決議 虛函式 帶有 關鍵字的函式,並且不帶有 標誌的 虛繼承帶有 關鍵字的繼承,基類被稱為虛基類,會在自己物件的例項中產生虛基類指標 虛函式與菱形繼承的問題 當發生繼承時,如果派生類重寫了基類的虛函...

c 類大小(涵蓋繼承 虛繼承 虛函式表)

涉及到c 中求類大小時需要特別注意一下幾點 為類的非靜態成員資料的型別大小之和 有編譯器額外加入的成員變數的大小,用來支援語言的某些特性 如 指向虛函式的指標 虛繼承 多重繼承 為了優化訪問效率,進行的邊緣調整 與類中的建構函式,析構函式以及其他的成員函式無關 5.私有繼承,會去繼承之前的私有成員變...