基类中this指针和派生类对象的关系,同名隐藏原则和作用域的示例

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()
}






你可能感兴趣的:(基类中this指针和派生类对象的关系,同名隐藏原则和作用域的示例)