C 覆蓋(虛函式的實現原理)

2021-07-23 17:28:07 字數 974 閱讀 2828

class shape

private:

int m_ir;

};class circle:public shape

};

類circle繼承類shape

當用shape類例項化乙個指標物件,並

shape *shape=new circle;
此時的虛函式是如何實現的呢?

當例項化乙個shape物件時,除了生成資料成員,還會生成乙個虛函式表指標成員,這個虛函式表指標與虛函式表同時出現,虛函式表只有乙個,而虛函式表指標指向虛函式表的首位址,在虛函式表中定義了乙個函式指標,這個函式指標指向了計算面積函式的首位址,當在主函式中呼叫了計算面積的函式時,編譯器通過虛函式表指標找到虛函式表,再在虛函式表中找到指向計算面積函式的指標,通過這個指標找到函式的入口位址,從而呼叫虛函式。

當派生類circle中沒有同名的計算面積函式時,在例項化circle的時候也會生成虛函式表指標和乙個虛函式表,而虛函式表中也有乙個指向計算面積函式的指標,這個指標是從它的基類中繼承來的,所以當在主函式中呼叫計算面積函式時,可以呼叫基類中所定義的計算面積函式。

當派生類circle中定義了同名的計算面積函式時(無論它前面有沒有virtual修飾,只要基類中的同名函式被virtual修飾,那麼編譯器會自動給派生類中的同名函式加上virtual字首),例項化circle的時候也會生成虛函式表指標和乙個虛函式表,而虛函式表中也有乙個指向計算面積函式的指標,這個指標一開始的值是從基類繼承而來,但在例項化circle之後,這個值就會被circle類中定義的計算面積函式的首位址所覆蓋。

這就是c++中的覆蓋的定義,要與隱藏區分開來。

C 虛函式實現原理

c 中的虛函式的作用主要是實現了多型的機制。基類定義虛函式,子類可以重寫該函式。每個類物件新增乙個成員,該成員中儲存了乙個指向函式位址陣列的指標,稱為虛表指標 vptr 該陣列稱為虛函式表 virtual function table,vtbl 即,每個類使用乙個虛函式表,每個類物件用乙個虛表指標。...

C 中虛函式的實現原理

1 對於c 中的虛函式一直都是靠著死記硬背的方式在使用,今天特地查閱了一下它的實現原理。2 虛函式 c 中為了實現多樣性的乙個工具。使用virtual關鍵字修飾的函式即為虛函式,派生類自動繼承虛函式性質。使用時,用基類指標指向派生類物件,直接呼叫派生類的虛函式。達到 介面與實現分離的目的 多樣性,相...

C 虛函式的底層實現原理

在c 中,多型是利用虛函式來實現的。比如說,有如下 include using namespace std class animal class dog public animal void makeanimalcry animal animal int main 輸出如下圖 這裡定義了乙個anim...