1. 事情的由来
最近在分析cocos2d-x启动代码的时候,不小心看到单例的程序
//定义一个app对象
AppDelegate app;
//执行app对象的run函数。进入帧循环
Application::getInstance()->run();
AppDelegate 是Application的子类,AppDelegate 是一个单例的模式,但是通过父类Application::getInstance()获取AppDelegate的单例指针,
父类怎么知道子类对象的指针呢?原来是在Application的构造函数中通过this指针记录下来,但是在定义派生类对象的时候,
底层调用父类构造函数的时候,父类构造函数this指针就是执行派生类对象吗?我当时没反应回来,后来咀嚼几次终于想明白了。
class A
{
public:
A(){}
};
class B:public A
{
public:
B(){}
};
当我们定义对象
B myb;
这个时候编译器会给对象myb分配内存,还会调用B和他的基类的构造函数,我们都知道编译器成员函数做转换,添加this形参
这个时候我们的A的构造函数变为
A(A * this){}
调用构造函数就变为:myb.A(&myb)
所以在基类中的this指针自然而然就是指向调用它的对象了也就是派生类myb对象。
2. 结论
当我们在基类中使用this指针调用成员的时候,有什么不一样的地方呢?
主要是普通的同名成员和虚函数的时候不一样,直接上代码吧
#include<iostream>
using namespace std;
class A
{
public:
A() {
x = 10;
}
void testcallvalue()
{
//这里调用的是A中的x
cout<<this->x<<endl;
}
void testcallvirtualfun()
{
//这里调用的是B中的vrfun函数
this->vrfun();
}
void virtual vrfun(){
cout<<"A()"<<endl;
}
int x;
};
class B:public A
{
public:
B() {
x = 20;
}
void virtual vrfun(){
cout<<"B()"<<endl;
}
int x;
};
int main()
{
B myb;
//========================================
//同名成员的测试
//直接通过对象调用里面的同名数据成员
cout<<myb.x<<endl;//20 这里调用的是B中定义的x
//直接通过对象调用里面的同名数据成员
myb.testcallvalue();//10
//========================================
myb.testcallvirtualfun();//B()
}