c 中的多型和vptr指標

2021-08-18 10:08:54 字數 1633 閱讀 1128

1.多型原理**

#include#include#includeusing namespace std;//01

//多型原理**

//要有繼承 虛函式重寫 父類指標指向子類物件

class parent

virtual void print()//動手腳 寫virtual關鍵字,c++編譯器會做特殊處理

virtual void print2()//動手腳 寫virtual關鍵字,c++編譯器會做特殊處理

private:

int a;

};class child:public parent

virtual void print()//動手腳 寫virtual關鍵字 c++編譯器會做特殊處理

private:

int b;

};void howtoplay(parent *base)

int main()

執行結果:parent

child

2.證明vptr指標的存在

#include#include#includeusing namespace std;//02

//證明vptr指標的存在

class parent1

void print()

private:

int a;

};class parent2

virtual void prite()

private:

int a;

};int main02()

//執行結果:sizeof(parent1):4 sizeof(parent2):8

//說明vptr的確存在,大小為4

3.vptr指標的分步初始化

//指標的分布初始化

//建構函式中呼叫虛函式能發生多型麼?也就是說,初始化子類物件時候會先呼叫父類的建構函式,

//父類的建構函式中又有乙個虛函式,此時這個虛函式是執行的子類的函式還是父類的函式

class parent

virtual void print()

private:

int a;

};class child :public parent

virtual void print()

private:

int a;

int b;

};void playobj(parent *base)

int main()

//執行結果:parent print

// child print

//沒有發生多型

//原因:child c1;//在定義物件的時候要初始化c1.vptr指標,初始化是分步驚醒的

//當執行父類的建構函式時,c1.vptr指向父類的虛函式表,

//當父類的虛函式執行完畢時,會再把指標指向子類的虛函式表

C 多型中的VPTR

以下文字摘錄自 為了完成這件事,編譯器對每個包含虛函式的類建立乙個表 稱為vtable 在vtable中,編譯器旋轉特定類的虛函式位址。在每個帶有虛函式的類中,編譯器 秘密 地置一指標,稱為vpointer 縮寫為vptr 指向這個物件的vtable。通過基類指標 或者引用 做虛函式呼叫時,也就是做...

C 多型中的VPTR

以下文字摘錄自為了完成這件事,編譯器對每個包含虛函式的類建立乙個表 稱為vtable 在vtable中,編譯器旋轉特定類的虛函式位址。在每個帶有虛函式的類中,編譯器 秘密 地置一指標,稱為vpointer 縮寫為vptr 指向這個物件的vtable。通過基類指標 或者引用 做虛函式呼叫時,也就是做多...

多型vptr指標思考一

多型是c 的靈魂之處,c 實現多型就是使用vptr指標,實現多型的三個條件,1.virtual 關鍵字 2.子類重寫父類的虛函式 3.父類指標呼叫子類物件虛函式 直接附上 發現vptr是儲存在父類中 當a是乙個物件時 輸出的是vptr指標的位址,void a 可以簡單的看作把 a 指向的記憶體空間的...