內聯函式:編譯時展開的,虛函式是為了實現多型,是動態行為,兩者是矛盾的。內聯函式展開就不存在了,也就不存在函式位址了,無法呼叫。
但是,由於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 帶純虛函式的類叫虛基類也叫抽象類,這種基類不能...