引用“luosiyong”的精彩回答

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

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樓:自由的鴻鵠

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

引用“paladinus”的精彩回答

什麼意思?你是說去美國的時間受限制還是回國的時間?去的話要在簽證簽發後的規定時間進入美國,如果超過這個時間了就算自動放棄了,再去美國需要再籤。回來的話就不存在了,你沒去,所以也沒有回國的時間限制問題。如果去了,j1是必須在規定時間回國的。 首先,j1收不收限制,這不一定,要看2019怎麼寫 其次,你...

引用「laizhilie」的精彩回答

只能信用卡刷卡消費然後申請分期付款業務最划算。但是信用卡分期沒有5期的,只有3期或者6期的。信用卡分期沒有利息,只有手續費。每月費率是0.8 每期支付1746.67元 手續費10000x0.8 本金10000 6 80 1666.67 1746.67 其中合計 手續費80x6 480元。 足球小子3...

引用“建築007”的精彩回答

天蠍老彬 可以同時申請,要具備一下條件 一 申請造價諮詢資質要求及申報材料 一 工程造價諮詢企業資質等級申請書 二 專職專業人員 含技術負責人 的造價工程師註冊證書 造價員資格證書 專業技術職稱證書 身份證和勞動合同 三 專職專業人員 含技術負責人 的人事 合同和企業為其交納的本年度社會基本養老保險...