虛繼承與虛函式表

2021-06-18 06:58:28 字數 1480 閱讀 1554

一 虛繼承

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

gd :  

public

d1, 

public

d2void

vd1()

virtual

void

vgd()

void

fgd()};

2)類圖:

3)vs2008的編譯選項檢視布局:

4)視覺化表示:

5)**驗證:(此時的虛函式表不是以null結尾,為什麼?)

typedef 

void(*

fun)();

void

printmember(

int*

pi)void

printvt(

int*

pvt)

}void

printmemberandvt(gd 

*pgd)

void

testvt()

6)驗證**結果:

7)總結:

虛繼承,使公共的基類在子類中只有乙份,我們看到虛繼承在多重繼承的基礎上多了vbtable來儲存到公共基類的偏移。

二 虛繼承執行時型別轉化

1)**驗證:

void

testdynamiccast()

2)驗證**結果:

3)總結:

還是從記憶體布局來看dynamic_cast時位址的變化,第乙個基類的位址與子類相同,其他的基類和虛基類需要做偏移。

**:

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

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

多重繼承與虛函式表

from 一 多重繼承 1 include iostream using namespace std class b1void f1 class b2void f2 class b3void f3 class d public b1,public b2,public b3virtual void v...

虛函式與虛函式表

當類中有虛函式時,類的大小會多4個位元組 多出的這4個位元組是乙個位址,指向一張表,裡面儲存了所有虛函式的位址 虛函式表 class base virtual void function 2 virtual void function 3 class sub public base virtual ...