C++虚继承(四) --- /d1 reportSingleClassLayout插入看类内存布局
base1內(nèi)存布局 1 #include <iostream> 2 using namespace std; 3 class animal 4 { 5 protected: 6 int age; 7 public: 8 virtual void print_age(void) = 0; 9 }; 10 class dog:public animal 11 { 12 public: 13 dog(){this->age = 2;} 14 ~dog(){} 15 virtual void print_age(void){cout<<"Wang,my age ="<< this->age<<endl;} 16 }; 17 class cat:public animal 18 { 19 public: 20 cat(){this->age = 1;} 21 ~cat(){} 22 virtual void print_age(void){cout<<"Miao,my age ="<< this->age<<endl;} 23 }; 24 int main(void) 25 { 26 cat kitty; 27 dog jd; 28 animal * pa; 29 int *p = (int*)(&kitty); 30 int *q = (int*)(&jd); 31 p[0] = q[0]; 32 cout<<p[1]<<endl; 33 cout<<q[1]<<endl; 34 pa = &kitty; 35 pa ->print_age(); 36 system("pause"); 37 return 0; 38 39 }
內(nèi)存布局:
這個(gè)內(nèi)存結(jié)構(gòu)圖分成了兩個(gè)部分,上面是內(nèi)存分布,下面是虛表,我們逐個(gè)看。VS所帶編譯器是把虛表指針放在了內(nèi)存的開始處(0地址偏移),然后再是成員變量;下面生成了虛表,緊跟在&[classname]_meta后面的0表示,這張?zhí)摫韺?duì)應(yīng)的虛指針在內(nèi)存中的分布,下面列出了虛函數(shù),左側(cè)的0是這個(gè)虛函數(shù)的序號(hào),這里只有一個(gè)虛函數(shù),所以只有一項(xiàng),如果有多個(gè)虛函數(shù),會(huì)有序號(hào)為1,為2的虛函數(shù)列出來(lái)。
編譯器是在構(gòu)造函數(shù)創(chuàng)建這個(gè)虛表指針以及虛表的。
那么編譯器是如何利用虛表指針與虛表來(lái)實(shí)現(xiàn)多態(tài)的呢?是這樣的,當(dāng)創(chuàng)建一個(gè)含有虛函數(shù)的父類的對(duì)象時(shí),編譯器在對(duì)象構(gòu)造時(shí)將虛表指針指向父類的虛函數(shù);同樣,當(dāng)創(chuàng)建子類的對(duì)象時(shí),編譯器在構(gòu)造函數(shù)里將虛表指針(子類只有一個(gè)虛表指針,它來(lái)自父類)指向子類的虛表(這個(gè)虛表里面的虛函數(shù)入口地址是子類的)。
輸出結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的C++虚继承(四) --- /d1 reportSingleClassLayout插入看类内存布局的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++虚继承(三) --- C++ 对象
- 下一篇: C++虚继承(五) --- 虚拟继承的概