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

本文探讨了在C++中,基类的this指针如何在派生类对象中工作,特别是在单例模式下,如何通过基类的getInstance()方法获取派生类的实例。文章通过分析单例模式的实现,揭示了在基类构造函数中,this指针实际上指向的是派生类的对象。同时,文章强调了在基类中使用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()
}






评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值