- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面试宝典之C虚函数虚继承
虚函数和虚继承及其在内存中布局1.虚函数一般类的布局class A{public:int m_pbl;protected:int m_prt;private:int m_prv;public:void fun() // 不在堆栈中占空间{cout Its fun. endl;}};1 class Asize(12):1 +---1 0| m_pbl1 4| m_prt1 8| m_prv1 +---1.1 单个类1.1.1 单个虚函数class A{public:int m_pbl;protected:int m_prt;private:int m_prv;public:void virtual f1(){cout Its f1. endl;}};2 class Asize(16):2 +---2 0| {vfptr} // 虚表指针2 4| m_pbl2 8| m_prt2 12| m_prv2 +---2 2 A::$vftable@: // 虚表2 | A_meta2 | 02 0| A::f12 2 A::f1 this adjustor: 01.1.2 多个虚函数class A{public:int m_pbl;protected:int m_prt;private:int m_prv;public:void virtual f1(){cout Its f1. endl;}void virtual f2(){cout Its f2. endl;}};1 class Asize(16):1 +---1 0| {vfptr}1 4| m_pbl1 8| m_prt1 12| m_prv1 +---1 1 A::$vftable@: // 同一张表中1 | A_meta1 | 01 0| A::f11 1| A::f21 1 A::f1 this adjustor: 01 A::f2 this adjustor: 01.2 继承1.2.1 不加函数class B : public A{};1 class Bsize(16):1 +---1 | +--- (base class A)1 0| | {vfptr}//同一个指针1 4| | m_pbl1 8| | m_prt1 12| | m_prv1 | +---1 +---1 1 B::$vftable@: // B的虚表1 | B_meta1 | 01 0| A::f11 1| A::f21.2.2 子类override父类的函数class B : public A{public:void f1(){cout Its f1 in B. endl;}};1 class Bsize(16):1 +---1 | +--- (base class A)1 0| | {vfptr} 1 4| | m_pbl1 8| | m_prt1 12| | m_prv1 | +---1 +---1 1 B::$vftable@:1 | B_meta // B用来标识类1 | 01 0| B::f1 // 变成了B的版本1 1| A::f21 1 B::f1 this adjustor: 01.2.3 子类添加虚函数class B : public A{public:void f1(){cout Its f1 in B. endl;}void virtual f3(){cout Its f3. endl;}};1 class Bsize(16):1 +---1 | +--- (base class A)1 0| | {vfptr} //合成一个表1 4| | m_pbl1 8| | m_prt1 12| | m_prv1 | +---1 +---1 1 B::$vftable@:1 | B_meta1 | 01 0| B::f11 1| A::f21 2| B::f3 // 添加到虚表的尾部,类标识为B1 1 B::f1 this adjustor: 01 B::f3 this adjustor: 01.2.4 多继承class A{private:int m_data;public:void virtual f1(){cout Its f1. endl;}};class B{public:void virtual f1(){cout Its f1 in B. endl;}};class C : public A, public B{};1 class Csize(12):1 +---1 | +--- (base class A)1 0| | {vfptr}1 4| | m_data1 | +---1 | +--- (base class B)
文档评论(0)