c+this指针(多重继承下的this指针调整)
c+this指针(多重继承下的this指针调整)关于本公众号[2] Effective C ,侯捷编著图2 多重继承时对象布局中this指针的调整base class 指针指向一个 derived class 对象, 但有时候上述的两个指针值并不相同。 这种情况下会有个偏移量 (offset ) 在运行期被施行于Derived 指针身上,用以取得正确的 Base 指针值。[1] C 新经典对象模型,王健伟编著
多重继承下的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;
}
运行结果
图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 ,侯捷编著
关于本公众号
“一名科研爱好者”微信公众号主要致力于机器学习、光通信、数学、编程、英文文章写作和画图等方面的学习。