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

2021-12-19 00:04:37 字數 2290 閱讀 3798

1樓:匿名使用者

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

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

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

2樓:匿名使用者

用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問題,求大神解

3樓:匿名使用者

對於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++中,虛擬函式能不能被繼承

4樓:閃閃紅紅星

必然能。虛擬函式不僅能被繼承,還能被改寫,這就是虛擬函式區別於普通函式的地方。

5樓:

可以繼承,多型性就是虛擬函式的作用,定義一個父類指標,指向不同的子類物件,就可以呼叫子類中的虛擬函式

6樓:流逝____的

虛擬函式可以被繼承,多型性

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

7樓:匿名使用者

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

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

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

8樓:匿名使用者

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

c++virtual函式重寫,在繼承的時候沒有寫關鍵字也仍然是虛擬函式嗎?

9樓:匿名使用者

父類定義成虛擬函式,子類中和父類虛擬函式相同名稱,參數列相同的函式會自動變成虛擬函式。不管加沒有virtual

10樓:額外覆蓋

如果基類宣告瞭一個函式為虛擬函式

那麼派生類裡重寫這個函式且函式名 引數 返回值什麼都不變的話會預設為虛擬函式

11樓:匿名使用者

會自動繼承virtual屬性。還是虛擬函式。

c 類的虛繼承到底從父類那繼承了什麼

虛繼承不管父類派生出多少個子類在記憶體總只存在一套資料,但是一般繼承會存在與派生類個數對應的n個資料 n為派生類個數 c 中的類繼承究竟有什麼作用?繼承能體現事物的普遍性和特殊性。這是c 物件導向程式設計的一個重要概念,繼承可以使 得到重用,子類還可以在父類的基礎上新增功能。對於通明函式,如果不是虛...

帶有虛擬函式的類能被例項化嗎,凡是包含純虛擬函式的類都是抽象類。

指標的型別是可以強行轉來轉去的。普通情況你轉什麼型別就調對應型別版的同名函式。但是虛函權數實現多型後,儘管可能你把指標轉成父類的型別,但是因為建立的時候是子類的型別,它還是會呼叫子類的這個虛擬函式。這樣可以統一 且正確運用子類的新特性。也因為如此,如果父類虛擬函式不做實現而 0成為純虛擬函式,那麼父...

C中父類的虛擬函式必須要實現嗎

虛擬函式是自帶實現的,因此派生類中可以選擇實現自己的,也可以直接使用基版類的。但是純虛擬函式一般權未提供實現,所以派生類基本需要提供實現,但是即使基類提供了預設實現,如果派生類需要進行例項化,那麼派生類還是需要提供實現的。你可以定義純虛擬函式,這部需要實現 c 中虛擬函式必須有定義嗎?需要例項化類的...