1、每個含有虛函式的類都含有乙個虛指標和乙個虛函式表,當sizeof求類的記憶體大小分配的時候,會計算上虛指標的大小(指標的大小就是4個位元組)。虛指標存放在棧中,用於指向存在於常量區的虛函式表。
如上**所示,輸出結果
base:8
derived:12
因為base中含有乙個虛指標和乙個int,所以為8
derived為base的子類,繼承了base的int,但是沒有繼承base的虛指標,在derived中自己生成了乙個虛指標(4位元組)和加上從base繼承來的int和自己的乙個int 所以是12個位元組。
現在來證明一下為什麼derived沒有繼承base的虛指標。
插入下列**:
其中p[0]指的是類中的首位址this指向的第乙個值,如果不是有虛指標的存在輸出的p[0]應該是i和j的值。
最終顯示:
從顯示可以看出,b1和b2的第乙個值是相同的,d1和d2的第乙個值也是相同的,但是b1和d1的第乙個值卻的不同的,從中可以得出結論:
1、從b1和b2的第乙個值相同,d1和d2的第乙個值相同可以知道乙個類共享乙個虛函式表,含有虛函式的類的第乙個值就是指向虛函式表的首位址,同時如果直接對&b1和&b2它們取值是不同的,可以說明,每個類的物件的虛指標的位址(由棧分配的)是不同的。
2、不同的類的物件的第乙個值不同說明不同類之間的虛函式表不同,而且虛指標也不會繼承。
2、含有虛函式的多重繼承
由上面可知:
對於多重繼承,在子類直接生成類似於三個表的乙個虛函式表,由
f=(fun)*((int *)*((int *)&dd+2));
f();
f=(fun)*((int *)*((int *)&dd+4));
f();
可知每個表佔的大小為8個位元組
通過f=(fun)*((int *)*((int *)&dd));
f();
f=(fun)*((int *)((int *)*((int *)&dd)+1));
f();
來取得表中的內容……
虛指標,虛函式,虛函式表,純虛函式
虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...
虛函式 純虛函式
一 定義.純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 virtual void funtion1 0 二 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成...
虛函式 純虛函式
虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標引用來訪問基類和派生類中的同名函式。include using namespace std class student student類成員函式的實現 宣告抽象基類shape class shape virtual float...