1樓:幻夢·人生
首先bai,class a包含一個虛擬函式,所du
以sizeof(a)的結果是zhi sizeof(虛表)的大小,也就是
dao4位元組回。
class b繼承class a,所以class b一定答是包含class a,只是包含的方式不同。
普通繼承,class a的虛表會和class b的虛表合併,所以class b中還是保留一個虛表就可以了。此時sizeof(b)的結果就是4.
虛繼承,class a和class b的關係就會微妙很多。由於c++支援多繼承,所以某些情況下會出現下圖中的繼承關係。這種水晶繼承會導致class d中包含兩份class a的物件。
此時就會出現訪問歧義的情況。
虛繼承就可以避免上面的情況。class a的資料會被放到虛表中。class d會識別到來自class b和c的虛表,然後將兩者合併。
所以回到本件問題,問題中的class b就會包含一份虛擬函式表指標,一份虛類指標。也就是sizeof(b)的結果是8。
c++中虛繼承和一般的繼承有什麼不同
2樓:隨意之歌
虛繼承不管父類派生出多少個子類在記憶體總只存在一套資料,但是一般繼承會存在與派生類個數對應的n個資料(n為派生類個數)
c++虛繼承與普通繼承問題 20
3樓:
class cc++ 過載 覆蓋 隱藏的bai區別和執行du方式成員函式
被過載zhi的特徵(1)相dao同的範圍(專在同一個類中)屬; (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 覆蓋是指派生類函式覆蓋基類函式,特徵是(1)不同的範圍(分別位於派生類與基類); (2)函式名字相同; (3)引數相同; (4)基類函式必須有virtual 關鍵字。 「隱藏」是指派生類的函式遮蔽了與其同名的基類函式,規則如下(1)如果派生類的函式與基類的函式同名,但是引數不同。
此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。 (2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual 關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆) 3種情況怎麼執行:
1。過載:看引數2。
隱藏:用什麼就呼叫什麼3。覆蓋:
呼叫派生類
4樓:自由的鴻鵠
如果有虛擬函式,就說明該類無法直接生成物件,而且其派生類需要重寫基類的虛擬函式;
c++虛繼承有什麼缺點
5樓:匿名使用者
不能抄說是缺點,只能說是特點。 b、c虛繼承a的話,那麼任何繼承b、c的類都得指定如何構造其中包含的a。
如果不是繼承,那麼類b、c分別各自指明如何構造其中包含的a,繼承b、c的類無需再指明也不能指明如何構造其中包含的a。
6樓:匿名使用者
虛繼承的話,虛基類必須由每個最後派生的類初始化
普通繼承的話,基類由這個基類直接派生的類初始化即可
在c++裡繼承虛基類和普通基類有什麼區別?
7樓:匿名使用者
class c
c++ 過載 覆蓋 隱藏的區別和執行方式
成員函式被過載的特徵
(1)相同的範圍(在同一個類中);
(2)函式名字相同;
(3)引數不同;
(4)virtual 關鍵字可有可無。
覆蓋是指派生類函式覆蓋基類函式,特徵是
(1)不同的範圍(分別位於派生類與基類);
(2)函式名字相同;
(3)引數相同;
(4)基類函式必須有virtual 關鍵字。
「隱藏」是指派生類的函式遮蔽了與其同名的基類函式,規則如下(1)如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。
(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual 關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)
3種情況怎麼執行:1。過載:看引數2。隱藏:用什麼就呼叫什麼3。覆蓋:呼叫派生類
8樓:匿名使用者
會輸出:class c
回答者: wanfustudio 回答的沒有錯,如果你想要把<<"class a"《也輸出來,採用構造方法才行,他會先建立父類的物件。
9樓:自由心魔
當某類的部分或全部直接基類是從另一個基類共同派生而來時,這直接基類中,從上一級基類繼承來的成員就擁有相同的名稱,派生類的物件的這些同名成員在記憶體中同時擁有多個拷貝,同一個函式名有多個對映。可以使用作用域分辨符來唯一標識並分別訪問它們。也可以將共同基類設定為虛基類,這時從不同的路徑繼承過來的同名資料成員在記憶體中只擁有一個拷貝,同一個函式名也只有一個對映。
也就是說虛基類解決了同名成員的唯一標識問題。
c++類的虛繼承到底從父類那繼承了什麼?
C 類繼承問題,C C 類繼承問題
你宣告的三個指標是不同型別的指標,會根據資料型別自動匹配,例如你如果宣告一個指標b指向a的一個物件的話會出錯,但是由於這個物件是c的,而c繼承了a和b,這時候通過資料型別強制轉換便可以從c的物件中獲取出b型別物件的地址。至於為什麼是a的,由於在繼承的時候有先後順序,其分配記憶體的先後順序也根據其繼承...
有關C 繼承問題高手進
在這裡,其實son類裡面會有兩個speak 成員 對它們的引用分別是 son1 new son son1 father speak 這個是從父類那裡繼承來的 son1 mother speak 這個是從母類那裡繼承來的 這種引用法沒有二義性,可以通過編譯 如果speak 是從父母類的公有基類裡繼承的...
我一直對C 中的虛擬函式,建構函式,繼承,派生之類的感到頭痛,感覺很亂,好像大多數程式都要用到這些
1.c 語言從c發展而來,它最引以為傲的特點就包括類的多型性,也就是你說的虛擬函式,c 的多型實現包含三個基本要素 類的繼承層次 類的引用跟指標 基類必須有虛擬函式,在滿足這三個條件的前提下,c 實現了動態型別識別然後根據實際型別呼叫虛擬函式。說起來似乎挺複雜,其實道理很簡單,就是為了根據實際物件型...