C 虛函式實現 虛函式表 虛表指標

2021-07-05 10:09:14 字數 1323 閱讀 3159

內聯函式:編譯時展開的,虛函式是為了實現多型,是動態行為,兩者是矛盾的。內聯函式展開就不存在了,也就不存在函式位址了,無法呼叫。

但是,由於inline只是向編譯器建議,所以編譯器不會讓inline和virtual同時起作用,所以也不會報錯。

建構函式:虛函式使用虛指標呼叫函式,呼叫建構函式之前沒有構造完成,是沒有虛指標的。另外虛函式是在基類指標中呼叫派生類函式的方式,建構函式不需要也不可能讓你這樣做。構造時已經知道了這個類的型別,這和虛函式向矛盾

靜態成員函式:靜態函式沒有this指標,無法呼叫虛函式。另外靜態函式屬於類,不屬於物件,也就不存在物件虛函式為基礎的多型。

想要更加深入理解上面那個問題,需要知道虛函式在c++中的實現方式。

來看一張,class1的實體(物件)中開頭是乙個指向虛函式表的指標,虛函式表中寸有虛函式的函式指標。class2類是class類的子類,對vfunc2()進行了覆寫(override),所以vfunc2在class2中的位址被覆寫。

我們可以用visual studio的除錯功能做個試驗

#include

using

namespace

std;

class base_1

virtual

void func1b()

virtual

void func1c()

};class base_2

virtual

void func2b()

virtual

void func2c()

};class childtest:public base_1,public base_2

virtual

void func1b()

virtual

void func2c()

};int main()

執行後實體中資料如下

類的實體(物件)的開頭有指向虛函式的指標,那麼虛函式表究竟在**?

類的所有物件共用一張虛函式表。而虛函式表具體位置各個編譯器實現不同,有興趣可以看

關於虛函式機制的更深的內容可以看rednaxelafx大大在知乎上的這個回答,

在查詢這些資料的時候,很多人都推薦一本書《inside the c++ objective model 》,看來之後要補一補。

虛函式表指標,虛函式表

對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,主是要乙個類的虛函式的位址表,這張表解決了繼承 覆蓋的問題,保證其容真實反應實際的函式。這樣,在有虛函式的類的例項中這個表被分配在了 這個例項...

C 虛函式指標虛函式表

c 的多型可以分為靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,而通過虛函式可以實現動態多型。實現函式的動態聯編其本質核心則是虛表指標與虛函式表。1.虛函式與純虛函式區別 1 虛函式在子類裡面也可以不過載的 但純虛必須在子類去實現 2 帶純虛函式的類叫虛基類也叫抽象類,這種基類不能...

C 虛函式指標虛函式表

c 的多型可以分為靜態多型和動態多型。函式過載和運算子過載實現的多型屬於靜態多型,而通過虛函式可以實現動態多型。實現函式的動態聯編其本質核心則是虛表指標與虛函式表。1.虛函式與純虛函式區別 1 虛函式在子類裡面也可以不過載的 但純虛必須在子類去實現 2 帶純虛函式的類叫虛基類也叫抽象類,這種基類不能...