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指针去调用。