// project100.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#include
"pch.h"
#include
using
namespace std;
//基類1
class
base1
virtual
voidg(
)};//基類2
class
base2
virtual
voidi(
)};//子類
class
derived
:public base1,
public base2
virtual
voidi(
)//覆蓋父類2的虛函式
//如下三個我們自己的虛函式
virtual
voidmh(
)virtual
voidmi(
)virtual
voidmj(
)};int
main()
func f2 =
(func)vptr1[1]
;//0x00ab15f0
func f3 =
(func)vptr1[2]
;//0x00ab15cd
func f4 =
(func)vptr1[3]
;//0x00ab15ff
func f5 =
(func)vptr1[4]
;//0x00ab15eb
func f6 =
(func)vptr1[5]
;//非正常
func f7 =
(func)vptr1[6]
; func f8 =
(func)vptr1[7]
; func f11 =
(func)vptr2[0]
;//0x00ab15af
func f22 =
(func)vptr2[1]
;//0x00ab15b9
func f33 =
(func)vptr2[2]
;//非正常
func f44 =
(func)vptr2[3]
; b1.f(
);b2.i(
);d.f()
; d.i(
);d.mh()
; d.g(
);//----------------
cout <<
"-----------------"
<< endl;f1(
);f2(
);f3(
);f4(
);f5(
);cout <<
"-------------"
<< endl;
f11();
f22();
//說明
//(1)乙個物件,如果它的類有多個基類則有多個虛函式表指標(注意是兩個虛函式表指標,而不是兩個虛函式表);
//在多繼承中,對應各個基類的vptr按繼承順序依次放置在類的記憶體空間中,且子類與第乙個基類共用乙個vptr
(第二個基類有自己的vptr)
;//(2)老師畫圖:適合vs2017。
//(2.1)子類物件ins有里那個虛函式表指標,vptr1,vptr2
//(2.2)類derived有兩個虛函式表,因為它繼承自兩個基類;
//(2.3)子類和第乙個基類公用乙個vptr(因為vptr指向乙個虛函式表,所以也可以說子類和第乙個基類
//共用乙個虛函式表vtbl),
//因為我們注意到了類derived的虛函式表1裡邊的5個函式,而g()正好是base1裡邊的函式。
//(2.4)子類中的虛函式覆蓋了父類中的同名虛函式。比如derived::f(),derived::i();
多重繼承與虛函式表
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...
C 虛函式表指標分析,及多重繼承虛函式表的分布
c 如果想滿足動態繫結,及基類指標或引用呼叫派生類函式,需要滿足三個條件 1.基類存在虛函式 2.基類指標或引用指向派生類物件 3.派生類需要重寫基類的虛函式 此時 a p 指標會指向 b類物件 記憶體布局中的 a類的基類子物件 從而找到vptr 虛函式表指標 接著找到b類中的虛函式表,由於b類中並...
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...