c虛繼承與普通繼承問題,c 虛繼承與普通繼承問題

2021-04-17 12:55:44 字數 2001 閱讀 8293

1樓:

class cc++ 過載 覆蓋 隱藏的bai區別和執行du方式成員函式

被過載zhi的特徵(1)相dao同的範圍(專在同一個類中)屬; (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 覆蓋是指派生類函式覆蓋基類函式,特徵是(1)不同的範圍(分別位於派生類與基類); (2)函式名字相同; (3)引數相同; (4)基類函式必須有virtual 關鍵字。 「隱藏」是指派生類的函式遮蔽了與其同名的基類函式,規則如下(1)如果派生類的函式與基類的函式同名,但是引數不同。

此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。 (2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual 關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆) 3種情況怎麼執行:

1。過載:看引數2。

隱藏:用什麼就呼叫什麼3。覆蓋:

呼叫派生類

2樓:自由的鴻鵠

如果有虛擬函式,就說明該類無法直接生成物件,而且其派生類需要重寫基類的虛擬函式;

c++中虛繼承和一般的繼承有什麼不同

3樓:隨意之歌

虛繼承不管父類派生出多少個子類在記憶體總只存在一套資料,但是一般繼承會存在與派生類個數對應的n個資料(n為派生類個數)

c++普通繼承和虛繼承

4樓:幻夢·人生

首先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++虛繼承有什麼缺點

5樓:匿名使用者

不能抄說是缺點,只能說是特點。 b、c虛繼承a的話,那麼任何繼承b、c的類都得指定如何構造其中包含的a。

如果不是繼承,那麼類b、c分別各自指明如何構造其中包含的a,繼承b、c的類無需再指明也不能指明如何構造其中包含的a。

6樓:匿名使用者

虛繼承的話,虛基類必須由每個最後派生的類初始化

普通繼承的話,基類由這個基類直接派生的類初始化即可

c++虛繼承問題

7樓:匿名使用者

介個嘛,c++的虛繼承是為了避免多重繼承產生的二義性問題。你這**有多重內繼承了?你這就是簡單容的滾雪球。

b類從a類派生,c類也從a類派生,d類從b、c類派生就是多重繼承,d從b那繼承了一份a的成員,又從c那繼承了一份a的成員。如果用虛繼承的話,d中就只會有一份a的成員。

c++類成員的儲存,只儲存成員變數和一個指向虛擬函式列表的指標。每個成員變數所佔的位元組數按最位元組數最長的那個算,就是向最長的那個變數對齊,另外那個指向虛擬函式列表的指標會佔4個位元組。

類a中有虛擬函式,先佔去4位元組用於存虛擬函式列表指標,再有char[3]佔3個位元組。但是char[3]實際佔有的位元組數會向那個指標看齊,故a佔的位元組數是4*2 = 8;

類b從a派生,從a繼承的成員佔8位元組,用於存虛擬函式列表指標佔4位元組,char[3]也佔4位元組,總共佔16位元組;

類c佔24位元組

C中虛繼承和虛解構函式的問題

因為基bai類的解構函式 du不是虛解構函式,zhi所以是根據指標的型別呼叫dao解構函式,而不是根版據指權針指向物件的型別呼叫解構函式。虛擬函式是在基類中被宣告為 virtual,並在派生類中重新定義的成員函式,可實現成員函式的動態過載。當一個類作為基類時,它的解構函式應該為虛解構函式。c 中 解...

c中父類中虛擬函式要全部繼承嗎,C中父類的虛擬函式必須要實現嗎

全部繼承是什麼意思?繼承了這個類,這個類的方法當然全部有的?你是不是想問是不是應該子類全部實現它的虛擬函式?不用的 只要不是純虛擬函式就可以不用實現,直接用父類的就可以的 c 中父類的虛擬函式必須要實現嗎 虛擬函式是自帶實現的,因此派生類中可以選擇實現自己的,也可以直接使用基版類的。但是純虛擬函式一...

關於c子類繼承的this指標的問題

cout d 我想應該是初始化順序吧 首先 cb類 初始化 基類 cd,這時候還並不知道派生類的 b 所以會報錯 初始完基類以後才會初始化自己,這個時候才會有成員 b 首先你要明確一點,this指標屬於某一具體物件,cb cb定義時,this指標屬於cb,可以呼叫cb的資料和函式成員,cd cd定義...