再續虛函式

2021-05-25 13:23:42 字數 1012 閱讀 6967

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...