參考:
虛函式表是乙個類的虛函式位址表,在虛函式類的例項中,這個表被分配到了例項的記憶體中。
c++編譯器保證虛函式表的指標位於物件例項中最前面的位置,因此可以通過物件例項的位址
得到這張虛函式表,然後遍歷其中的函式指標,並呼叫相應的函式。下面分幾種情況討論(可參考
上述博文,博主畫了圖,很清楚):
1、單繼承(無虛函式覆蓋):
在派生類的例項中,可以看到:虛函式按照宣告順序放於同一張表中,且父類的虛函式放於
子類的虛函式之前。
2、單繼承(有虛數覆蓋):
在派生類的例項中,覆蓋的函式放到了父類相應的函式的位置,沒有被覆蓋的函式依舊。
3、多重繼承(無虛函式覆蓋):
在子類例項中,每個父類都有自己的虛表,且子類的虛函式放到了第乙個虛表中。
4、多重繼承(有虛函式覆蓋):
將父類相應虛函式的位置,皆換成子類相應的虛函式。
補充:上面的內容缺少了虛繼承的情況,下面是對其補充,不得不說,c++實在是太複雜了。
在虛繼承的情況下,父類的虛函式不會與子類共用乙個虛函式指標,並且子類還會再生成乙個
虛指標指向父類。
參考:
C 虛函式表解析
前言 c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式...
C 虛函式表解析
c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,...
C 虛函式表解析
今天我做的筆記 c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技...