C 虛函式表

2021-09-28 14:25:19 字數 1024 閱讀 6951

虛函式

為了實現執行時多型,通過指向派生類的基類指標或引用呼叫派生類中同名覆蓋函式。虛函式用法格式為:virtual 函式返回型別 函式名(參數列)

虛函式表

虛函式呼叫是通過虛函式表簡介訪問的,就是說基類指標或引用指向派生類時,基類的虛函式表被重寫。所以呼叫函式被覆蓋。

含虛函式類的例項的第乙個指標變數指向虛函式表,

class base

};檢視base的例項會在棧中占用的空間

64位系統中 cout《輸出id值不正確,這是因為呼叫類的函式時,隱式的把物件指標this傳遞進去。

所以修改函式指標

typedef void (*fun)(base & base);

呼叫pf(base);

完整**如下

#includeusing namespace std;

class base

virtual void show()

virtual void getid()

private:

int id;

};class child:public base

void show()

void getid()

private:

int id;

};struct nullstruct//空類有乙個佔位

;int main()

輸出:![在這裡插入描述](

虛基類繼承,子類繼承了父類的虛函式表指標成員,但是,和繼承的父物件普通成員變數由父類構造初始化不同,當定義子物件時,這個虛表指標變數的值被子類的虛表指標覆蓋。

另外,函式指標的值類似pc值。變數的指標加1則指標的值加變數長度大小,例如

int a;

int *pa = &a;

a的長度是固定的,4個位元組

所以(long)(pa + 1) - (long)(pa)結果是4;

而函式的長度是不定的,所以(long)(pf + 1) - (long)(pf)結果是1;

C 虛函式表

考慮最簡單的有虛函式的繼承關係 class f class s public f 此時,我們可以定義乙個父類的指標,實際指向乙個子類的物件。呼叫func函式的結果是子類的函式。虛函式在這裡是動態繫結的。f f new s f func 輸出s func 我們知道子類即使不定義虛函式也會繼承該虛函式表...

C 虛函式表

一般來說,對於開發者我們只需要知道虛函式的使用方法,以及虛函式表的存在即可。但面試時往往會遇到更細節的問題,比如讓你實現乙個虛函式機制,雖然不太實用,總歸了解些底層知識也是件好事。但如果有人苦苦相逼一定要拿這個刷人,你就去罵他吧,你才是寫編譯器的,你們全家都是寫編譯器的。唉,我有些失態了.1.虛函式...

C 虛函式表

c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,...