虛繼承的類大小問題,虛繼承,派生類重寫基類虛擬函式,派生類大小的問題,具體看程式碼

2021-12-28 09:38:33 字數 3033 閱讀 7029

1樓:文件類共創空間

虛繼承 是物件導向程式設計中的一種技術,是指一個指定的基類,在繼承體系結構中,將其成員資料例項共享給也從這個基型別直接或間接派生的其它類。

虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現的。如下圖所示。

類d繼承自類b1、b2,而類b1、b2都繼承自類a,因此出現如右圖所示的局面(非虛基類)。

虛擬繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現的。如下圖所示。

類d繼承自類b1、b2,而類b1、b2都繼承自類a,因此出現如右圖所示的局面(非虛基類)。

為了節省記憶體空間,可以將b1、b2對a的繼承定義為虛擬繼承,而a就成了虛擬基類。最後形成如左圖所示的情況。

實現的**如下:

class a;

class b1:public virtual a;

class b2:public virtual a;

class d:public b1,public b2;

2樓:清明雨上

derive內部地址開頭是一個vfptr,4位元組,指向derive的虛擬函式表,後面緊跟者一個vbptr,4位元組,指向derive的虛基類表,(這張表中首元素為derive首地址到vbptr地址的偏移量,第二個元素為vbptr地址到base的偏移量,當然這是題外話),derive類內部繼承的base有自己的vfptr,4位元組,指向derive虛繼承的base的虛擬函式表(如果derive重寫了base的虛擬函式,會改變這張表中的對應項的指向,至於最開始提到的derive中的vfptr指向的虛擬函式表裡只儲存derive自己建立的虛擬函式地址,這也是題外話)總之總共就是12位元組了。至於成員函式,那是不會佔用物件記憶體的啊,根本影響不到物件的大小。

3樓:匿名使用者

如果有虛擬函式,類的大小+4個位元組。(用來存放vptr)

如果是虛繼承,虛基類的大小不算了,但是要算4個位元組(用來存放指向虛基物件的指標)。

4樓:匿名使用者

看了網上的說明:

如果有虛擬函式,類的大小+4個位元組。(用來存放vptr)如果是虛繼承,虛基類的大小不算了,但是要算4個位元組(用來存放指向虛基物件的指標)

那是不是就這麼理解?

base裡頭虛擬函式指標4,其它函式沒有長度。derive由於繼承了base4,繼承函式4,int get_num() 函式4,一共12

5樓:匿名使用者

編譯器並不是簡單把物件簡單堆砌在一起的,它可以做一些變化

虛繼承,派生類重寫基類虛擬函式,派生類大小的問題,具體看**

6樓:匿名使用者

「如果是虛繼承,則此處表明子類有一個自己的虛擬函式表」

我覺得你理解有點點錯誤,就算是虛繼承,虛擬函式所在的表也只是同一份,不同的是,父類和子類都儲存了一個指向該虛擬函式表的指標(而普通的繼承只有一個指向虛擬函式表的指標)。

之所以會多於4bytes 應該是b類中test2()這個虛擬函式父類中沒有,又由於是虛繼承的特殊性,所以在b類中test()和test2()不在同一個虛擬函式表中,b類另外用了一個指標儲存test2()所在的虛擬函式表地址,所以這裡b類才會有兩個虛擬函式表,才會多出4bytes,這4bytes是另外一個虛擬函式表的地址,我是這麼理解的!也實踐證明過test2()並不在test()所在的虛表中,如有不同意見,或覺得有誤,請提出,共同學習!

7樓:匿名使用者

推薦一本書給你《深度探索c++物件模型》

虛擬函式和虛繼承的大小問題_一個簡單程式

8樓:匿名使用者

我用的vc6,結果分別是8,20,32.

a的大小為8的原因是位元組對齊,即虛擬函式表指標佔4位元組,k佔3位元組,然後編譯器補了1位元組,將類的大小湊成4的倍數,以方便32位系統存取

b,c的大小依次增加12位元組.是因為多了子類自身的非繼承虛擬函式表指標4位元組,繼承自父類的虛擬函式表指標4位元組,char陣列3位元組加上補齊的1位元組.

9樓:匿名使用者

用vc6.0執行結果

sizeof(a)8

sizeof(b)20

sizeof(c)32

classa中char k[3]佔3個位元組virtual void aa(){}相當於指標佔4個位元組

對齊後為8個位元組

classb中char j[3]佔3個位元組virtual void bb(){}相當於指標佔4個位元組

對齊後為8個位元組,加上classa中的8個位元組,是16個位元組。由於多了虛繼承,還要加4位元組的指標空間,一共是20位元組

classc以此類推,共32個位元組

執行結果與機器的位數,編譯器的設定是有關的

詳細過程可參見下面

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

10樓:匿名使用者

對於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中,基類是抽象類(有純虛擬函式),在派生類(公有繼承)中,能不能呼叫初始化基類物件

能呼叫如果創bai建物件是b b 2,3 那du麼就會執行b int m,int n 0 這個zhi建構函式dao,進而顯式呼叫了基類a的構專造函式a int a 因屬為初始化列表裡寫明瞭a m 構造方式 假如沒有這個a m 語句,那麼就會呼叫a的預設建構函式,但a裡沒有寫a 所以就會報錯 沒有適合...

單繼承和多繼承的派生類建構函式和解構函式的構造規則和執行順序是怎樣的

多繼承派生類建構函式的執行順序是先執行所有基類的建構函式 順序按照定義派生類時指定的各基類順序 再執行派生類的建構函式,解構函式執行順序,與建構函式完全相反 因為,資料是按棧儲存的 單繼承先執行基類建構函式,在執行派生類建構函式,解構函式執行順序與建構函式相反。當基類的建構函式沒有引數,或沒有顯式定...

c基類中的成員函式的引數是派生類怎麼辦

先宣告派生類,將成員函式引數設為派生類的引用 include using namespace std class b class a int main 不知道你是不是要問這個 那還放在基類搞什麼,不如弄成虛擬函式。c 中派生類如何使用基類中的資料成員 如果你是派生類例項,這個結果是正確的,派生後會覆...