欢迎来到天天文库
浏览记录
ID:9396716
大小:39.51 KB
页数:16页
时间:2018-04-30
《面试宝典之c++虚函数、虚继承》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、虚函数和虚继承及其在内存中布局1.虚函数一般类的布局classA{public:intm_pbl;protected:intm_prt;private:intm_prv;public:voidfun()//不在堆栈中占空间{cout<<"It'sfun."<classAsize(12):1>+---1>0
2、m_pbl1>4
3、m_prt1>8
4、m_prv1>+---1.1单个类1.1.1单个虚函数classA{public:intm_pbl;protected:intm_prt;private:intm_prv;
5、public:voidvirtualf1(){cout<<"It'sf1."<classAsize(16):2>+---2>0
6、{vfptr}//虚表指针2>4
7、m_pbl2>8
8、m_prt2>12
9、m_prv2>+---2>2>A::$vftable@://虚表2>
10、&A_meta2>
11、02>0
12、&A::f12>2>A::f1thisadjustor:01.1.2多个虚函数classA{public:intm_pbl;protected:intm_prt;private:intm_prv;public:voi
13、dvirtualf1(){cout<<"It'sf1."<classAsize(16):1>+---1>0
14、{vfptr}1>4
15、m_pbl1>8
16、m_prt1>12
17、m_prv1>+---1>1>A::$vftable@://同一张表中1>
18、&A_meta1>
19、01>0
20、&A::f11>1
21、&A::f21>1>A::f1thisadjustor:01>A::f2thisadjustor:01.2继承1.2.1不加函数classB:p
22、ublicA{};1>classBsize(16):1>+---1>
23、+---(baseclassA)1>0
24、
25、{vfptr}//同一个指针1>4
26、
27、m_pbl1>8
28、
29、m_prt1>12
30、
31、m_prv1>
32、+---1>+---1>1>B::$vftable@://B的虚表1>
33、&B_meta1>
34、01>0
35、&A::f11>1
36、&A::f21.2.2子类override父类的函数classB:publicA{public:voidf1(){cout<<"It'sf1inB."<classBsize(16):1>
37、+---1>
38、+---(baseclassA)1>0
39、
40、{vfptr}1>4
41、
42、m_pbl1>8
43、
44、m_prt1>12
45、
46、m_prv1>
47、+---1>+---1>1>B::$vftable@:1>
48、&B_meta//B用来标识类1>
49、01>0
50、&B::f1//变成了B的版本1>1
51、&A::f21>1>B::f1thisadjustor:01.2.3子类添加虚函数classB:publicA{public:voidf1(){cout<<"It'sf1inB."<52、"<classBsize(16):1>+---1>53、+---(baseclassA)1>054、55、{vfptr}//合成一个表1>456、57、m_pbl1>858、59、m_prt1>1260、61、m_prv1>62、+---1>+---1>1>B::$vftable@:1>63、&B_meta1>64、01>065、&B::f11>166、&A::f21>267、&B::f3//添加到虚表的尾部,类标识为B1>1>B::f1thisadjustor:01>B::f3thisadjustor:01.2.4多继承classA{private:intm_data68、;public:voidvirtualf1(){cout<<"It'sf1."<classCsize(12):1>+---1>69、+---(baseclassA)1>070、71、{vfptr}1>472、73、m_data1>74、+---1>75、+---(baseclassB)1>876、77、{vfptr}//多个指针1>78、+---1>+---1>1>C::$vftable79、@A@:1>80、&C_meta1>81、01>082、&A::f11>1>C::$vftable@B@:1>83、-81>084、&B::f11.3纯虚函数1.3.1只在父类classA{private:intm_data;public:voidvir
52、"<classBsize(16):1>+---1>
53、+---(baseclassA)1>0
54、
55、{vfptr}//合成一个表1>4
56、
57、m_pbl1>8
58、
59、m_prt1>12
60、
61、m_prv1>
62、+---1>+---1>1>B::$vftable@:1>
63、&B_meta1>
64、01>0
65、&B::f11>1
66、&A::f21>2
67、&B::f3//添加到虚表的尾部,类标识为B1>1>B::f1thisadjustor:01>B::f3thisadjustor:01.2.4多继承classA{private:intm_data
68、;public:voidvirtualf1(){cout<<"It'sf1."<classCsize(12):1>+---1>
69、+---(baseclassA)1>0
70、
71、{vfptr}1>4
72、
73、m_data1>
74、+---1>
75、+---(baseclassB)1>8
76、
77、{vfptr}//多个指针1>
78、+---1>+---1>1>C::$vftable
79、@A@:1>
80、&C_meta1>
81、01>0
82、&A::f11>1>C::$vftable@B@:1>
83、-81>0
84、&B::f11.3纯虚函数1.3.1只在父类classA{private:intm_data;public:voidvir
此文档下载收益归作者所有