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

来源:互联网 发布:淘宝帐号查询 编辑:程序博客网 时间:2024/06/14 23:00

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






0 0
原创粉丝点击