先看如下代码
class A
{
public:
int a;
A()
{
printf("A::A()的this指针:%p!\n", this);
}
void funA()
{
printf("A::funA()的this指针:%p!\n", this);
}
};
class B
{
public:
int b;
B()
{
printf("B::B()的this指针:%p!\n", this);
}
void funB()
{
printf("B::funB()的this指针:%p!\n", this);
}
};
class C :public A, public B
{
public:
int c;
C()
{
printf("C::C()的this指针:%p!\n", this);
}
void funC()
{
printf("C::funC()的this指针:%p!\n", this);
}
};
void main()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl;
C myc;
myc.funA();
myc.funB();
myc.funC ();
system("pause");
}
结果:
总结:1.派生类对象 他是包含基类对象的
2.如果派生类只从一个基类继承的话,那么这个派生类对象的地址和基类子对象的地址相同
3.但如果派生类对象同时继承多个基类,那大家就要注意:
第一个基类子类对象的开始地址和派生类对象的开始地址相同。
后续这些基类子对象的开始地址和派生类对象的开始地址相差多少呢?那就得把前面那些基类子对象所占用的内存空间加上。
下面是个示意图:
4.你调用哪个子类的成员函数,这个this指针就会被编译器自动调整到对象的内存布局中,对应该子类对象的起始地址那去。