引用「luosiyong」的精彩回答

時間 2021-08-11 17:12:03

1樓:匿名使用者

sizeof(a) + sizeof(b) + sizeof(class_ptr)

class_ptr即類指標,指向virtual說明的虛基類列表

注意,這裡面存在記憶體對齊規則

第一個**:

sizeof(a) + sizeof(b) + sizeof(class_ptr) = 1 + 1 + 4, 對齊,得到8

第二個**:

sizeof(a) + sizeof(b) = sizeof(vptr) + sizeof(vptr) = 4 + 4 = 8,虛擬函式表指標

第三個**:

sizeof(a) + sizeof(b) + sizeof(class_ptr) = 4 + 4 + 4 = 12

就是在第二個的基礎上多了一個class_ptr,無論多少個類,都只有一個class_ptr指向這一系列的virtual class。

2樓:匿名使用者

表包含了父類的虛基類,也包含自己的虛基類,如果子類中有虛擬函式過載了父類的虛擬函式,那麼直接在子類的虛基類表中修改繼承父類表中所覆蓋的函式。這裡的解構函式就是這種情況,他繼承了2個虛基類表,但是裡面的兩個解構函式是一樣的。都被覆蓋了。

你看看下面這個文章,就會理解,

你的這個問題屬於

一般繼承(有虛擬函式覆蓋)。這種情況

這邊文章中就有圖。

c++虛繼承有什麼缺點

3樓:匿名使用者

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

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

4樓:匿名使用者

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

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

c++中虛繼承與普通繼承的sizeof問題,求大神解

5樓:匿名使用者

對於class a,

(1)由於含有虛擬函式,包含虛擬函式指標,大小4位元組。

(2)a陣列的型別是char,大小是3,佔3位元組,因為需要前面對齊到4的整數倍,所以有1個佔位符。

因此,總的大小是4+3+1=8

對於class b,

(1)由於含有虛擬函式,包含虛擬函式指標,大小4位元組。

(2)b陣列型別是char,大小是3,佔3位元組。因為需要前面對齊到4的整數倍,所以有1個佔位符。

(3)繼承a的char陣列,大小是3,佔3位元組。因為需要前面對齊到4的整數倍,所以有1個佔位符。

因此,總的大小是4+3+1+3+1=12

對於class c,

(1)由於含有虛擬函式,包含虛擬函式指標,大小4位元組。

(2)c陣列型別是char,大小是3,佔3位元組。因為需要前面對齊到4的整數倍,所以有1個佔位符。

(3)由於是虛繼承,有一個指向父類的指標,大小位元組。

(4)父類a本身大小為8位元組。

因此,總的大小為4+3+1+4+8=20

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

6樓:隨意之歌

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

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++虛擬函式,虛繼承的問題

8樓:匿名使用者

感覺你這寫的好複雜。。。一般的菱形繼承最多也就這樣:

class d :public /*virtual*/ b, public /*virtual*/ c

};而你這個,,是不是叫,,多虛繼承?

我這邊效果如下:(vs2013,64位,指標都是8個位元組)變化是 56,48,40,32,24。。

9樓:篤俠

可能是不同編譯器有不同的處理方式吧,在vc 6中 ...再去除virtual b中的virtual

結果就是16。

c++虛繼承與普通繼承問題 20

10樓:

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

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

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

1。過載:看引數2。

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

呼叫派生類

11樓:自由的鴻鵠

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

引用「uhuhbbh」的精彩回答

卓師兄 手機相簿中的 是我們最容易丟失的,一不小心就刪掉了,刪除了不要擔心,跟著方法來操作 職場辦公技巧達人 相信大家都誤刪過手機裡面的一些 吧,那麼有哪些方法可以幫助我們及時恢復呢,接下來就讓我們看看吧。這裡主要介紹的是第三方軟體和華為手機系統自帶的恢復方法,希望可以幫到大家,讓大家找回心愛的 相...

引用“ronsonlee”的精彩回答

1 蘋果官方售後iphone5s換屏 由於iphone5s螢幕屬於人為不小心操作碰壞,摔壞的iphone5s螢幕不在蘋果保修範圍,因此前往蘋果售後服務點維修是肯定要收維修費。據悉蘋果官方售後服務點更換iphone5s原裝螢幕的 在兩三百美元左右,也就是需要一兩千元,網上有稱官方售後iphone5s換...

引用「12133890」的精彩回答

開設英語專業院校 本專業被評為a 等級的學校有 清華大學 北京大學 復旦大學 南京大學四川大學 北京師範大學 浙江大學 山東大學南開大學 中山大學 上海交通大學 華東師範大學廈門大學 東北師範大學 北京外國語大學 華中師範大學上海外國語大學 湖南師範大學 南京師範大學 廣東外語外貿大學遼寧大學 西安...