欢迎大家来到IT世界,在知识的湖畔探索吧!
多重继承下的this指针调整
调用哪个子类的成员函数,这个this指针就会被编译器自动调整到对象内存布局中对应该类子对象的起始地址那去。
多重继承this指针调整案例
代码
#include <iostream> using namespace std; class A { public: int a; A(){printf("A::A()的this指针是:%p!\n", this);} void funcA() {printf("A::funcA()的this指针是:%p!\n", this);} }; class B { public: int b; B(){printf("B::B()的this指针是:%p!\n", this);} void funcB() {printf("B::funcB()的this指针是:%p!\n", this);} }; //先继承B后继承A class C : public B, public A{ public: int c; C(){printf("C::C()的this指针是:%p!\n", this);} void funcC() {printf("C::funcC()的this指针是:%p!\n", this);} }; int main(){ //this指针调整:多重继承 cout << sizeof(B) << endl;//4 cout << sizeof(A) << endl;//4 cout << sizeof(C) << endl;//12 C myc; B* Pb = &myc;//隐喻地将 Derived* 转换为 Base* A* Pa = &myc;//隐喻地将 Derived* 转换为 Base* cout << &myc << endl;//0133FEA0 cout << Pb << endl;//0133FEA0 cout << Pa << endl;//0133FEA4 return 0; }
欢迎大家来到IT世界,在知识的湖畔探索吧!
运行结果

欢迎大家来到IT世界,在知识的湖畔探索吧!
图1 程序运行结果
分析原因
A类对象占4个字节(int a;成员),B类对象占4个字节(int b;成员),而C类,因为继承自A类和B类,并且C类还有一个字节的成员的变量c,因此C类对象占4(A类)+4(B类)+4(成员变量c)=12字节。C类是先继承B类再继承A类,所以子类C的this指针才跟父类B一样,具体如图2所示
图2 多重继承时对象布局中this指针的调整
总结
base class 指针指向一个 derived class 对象, 但有时候上述的两个指针值并不相同。 这种情况下会有个偏移量 (offset ) 在运行期被施行于Derived 指针身上,用以取得正确的 Base 指针值。
参考文献
[1] C++新经典对象模型,王健伟编著
[2] Effective C++,侯捷编著
关于本公众号
“一名科研爱好者”微信公众号主要致力于机器学习、光通信、数学、编程、英文文章写作和画图等方面的学习。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/108154.html