this指针调整问题

this指针调整:出现在多重继承的情况中

class A
{
public:      
       A()
       {
              printf("A():%p\n", this);
       }
       void funA()
       {
              printf("funA():%p\n", this);
       }
public:
       int a;
};
class B
{
public:
       B()
       {
              printf("B():%p\n", this);
       }
       void funB()
       {
              printf("funB():%p\n", this);
       }
public:
       int b;
};
class C :public A, public B  //继承的顺序和类C的内存空间布局有关
{
public:
       C()
       {
              printf("C():%p\n", this);
       }
       void funC()
       {
              printf("funC():%p\n", this);
       }
public:
       int c;
};
int main()
{
       cout << sizeof(A) << endl;
       cout << sizeof(B) << endl;
       cout << sizeof(C) << endl;
       C obj;
       obj.funA();
       obj.funB();
       obj.funC();
}

结论:如果派生类只继承一个基类,那么这个基类的地址和派生类的地址相同。

如果一个类,同时继承多个基类,那么这个子类的对象和它继承顺序的第一个基类的地址相同。

在这里插入图片描述

class A
{
public:
       
       A()
       {
              printf("A():%p\n", this);
       }
       void funA()
       {
              printf("A::funA():%p\n", this);
       }
public:
       int a;
};
class B
{
public:
       B()
       {
              printf("B():%p\n", this);
       }
       void funB()
       {
              printf("B::funB():%p\n", this);
       }
public:
       int b;
};
class C :public A, public B
{
public:
       C()
       {
              printf("C():%p\n", this);
       }
       void funB() //覆盖掉类B中的funb函数,所以调用该函数时,使用的this指针就会调整,即用类C的this指针去调用该函数。
       {
              printf("C::funB():%p\n", this);
       }
       void funC()
       {
              printf("C::funC():%p\n", this);
       }
public:
       int c;
};
int main()
{
       cout << sizeof(A) << endl;
       cout << sizeof(B) << endl;
       cout << sizeof(C) << endl;
       C obj;
       obj.funA();
       obj.funB();
       obj.funC();
}

总结:该案列只有一些简单的成员函数,无虚函数,,所以分析起来也较简单。
这种情况的话,一般时出现在多重继承(继承多个父类)中,,后面的话,,调用那个子类或者父类的成员函数,,就用谁的this指针去调用。

比如说,,这里有3个类,,A和C的this指针是相同的(和继承顺序有关),所以调用A和C的成员函数的this指针相同,,调用B的成员函数,就用B的this指针去调用。

上面,C类覆盖了B里的一个成员函数,所以再调用这个成员函数的话,调用这个函数的话就变成调用C里的这个函数了,也就是用C的this指针去调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值