一 虛繼承
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 ...