1. 程式人生 > >虛繼承總結(重點:虛繼承與虛擬函式)

虛繼承總結(重點:虛繼承與虛擬函式)

虛繼承常考題目:


下面我們進行分析:

因為每個存在虛擬函式的類都要有一個4位元組的指標指向自己的虛擬函式表,所以每種情況的類a所佔的位元組數應該是沒有什麼問題的。

 那麼類b的位元組數怎麼算呢?看“第一種”和“第三種”情況採用的是虛繼承,那麼這時候就要有這樣的一個指標vptr_b_a,這個指標叫虛類指標,也是四個位元組;還要包括類a的位元組數,所以類b的位元組數就求出來了。而“第二種”和“第四種”情況則不包括vptr_b_a這個指標,這回應該木有問題了吧。

c++過載、覆蓋、隱藏的區別和執行方式

成員函式被過載的特徵
(1)相同的範圍(在同一個類中);
(2)函式名字相同;
(3)引數不同;
(4)virtual 關鍵字可有可無。
“覆蓋”是指派生類函式覆蓋基類函式,特徵是:


(1)不同的範圍(分別位於派生類與基類);
(2)函式名字相同;
(3)引數相同;
(4)基類函式必須有virtual 關鍵字。
“隱藏”是指派生類的函式遮蔽了與其同名的基類函式,特徵是:

(1)如果派生類的函式與基類的函式同名,但是引數不同,此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。
(2)如果派生類的函式與基類的函式同名,但是引數相同,但是基類函式沒有virtual 關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。

小結:說白了就是如果派生類和基類的函式名和引數都相同,屬於覆蓋,這是可以理解的吧,完全一樣當然要覆蓋了;如果只是函式名相同,引數並不相同,則屬於隱藏。

 三種情況怎麼執行:

過載:看引數。

隱藏:用什麼就呼叫什麼。

覆蓋:呼叫派生類。

參考: