1. 源**
#include
using namespace std;
class base
public :
class der : public base
public:
void test()
int main()
執行後的結果 :
先來看看base類建立的物件有多大
然而用sizeof(b)時結果卻為4 ,這是什麼情況
用監視可以看到在取位址d,下面放的是乙個位址,而我們知道位址就是4個位元組的大小(見記憶體1)
其實這個位址有名字的叫做虛表位址
但是這個位址下有儲存些什麼東西(見記憶體2)
可以清晰的看到這貌似像乙個表裡面儲存的是在base類那些虛函式的位址,其實它叫虛表
2.pb->funtest();這一句是如何實現的,那就要看看編譯器做了些什麼了
在第三步中,語言有點欠缺,就是並不是直接將eax中內容直接給 eax,又是會根據在虛表中儲存的位置有所變動,
4.還有一種情況就是base類的指標指向派生類der的物件時,是什麼情況,
原始碼變動:
void test()
看好了,派生類中只是對基類的虛函式funtest()沒有重寫,其他兩個都重寫了
執行結果:
分析方法和上面一樣,不囉嗦了
本文出自 「埋葬的記憶」 部落格,請務必保留此出處
含有虛函式,虛繼承的類的大小
當類中含有虛繼承時 在vs環境下,linux環境下有歧義 1.派生類物件中會新增乙個指標,該指標指向虛繼承的基類,稱為虛類指標 cptr 每乙個指標只指向其中乙個虛繼承的類,也就是說,虛繼承了幾個類,就會有幾個cptr。2.父類當中的成員變數 虛函式指標 vptr 虛類指標 cptr 仍然會被複製到...
含有虛函式的類sizeof大小
01 include 02 using namespace std 04 class base1 06 virtual void fun11 07 public 08 virtual base1 09 11 class base2 13 15 class derivedfromone public ...
含有虛函式的類sizeof大小
說明 1 乙個類中若有虛函式,不論是自己的虛函式,還是繼承而來的 那麼類中就有乙個成員變數 虛函式指標,這個指標指向乙個虛函式表,虛函式表的第一項是類的typeinfo資訊,之後的項為此類的所有虛函式的位址。2 假設經過成員對齊後的類的大小為size個位元組。那麼類的sizeof大小可以這麼計算 s...