基类中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
- 基类中this指针和派生类对象的关系,同名隐藏原则和作用域的示例
- 基类函数的this指针和派生类函数的this指针
- 用基类指针创建的派生类对象,从而无法访问派生类对象的数据和成员
- 用基类指针创建的派生类对象,无法访问派生类对象的数据和成员
- 对 this 指针的理解和作用
- 基类指针、派生类指针指向基类对象和派生类对象的4种方式
- 关于基类的this和派生类的this
- 派生类和基类的关系
- 基类和派生类的关系
- c++的this指针和对象数组
- 面向对象设计原则及类和类的关系
- 基类和派生类非虚函数和成员变量的同名
- C++的类对象的sizeof值和this指针
- C++ "基类"和"派生类"作用域的效果
- 基类对象和派生类对象之间的赋值关系
- ?第三讲中孙老师提到的this指针到底指向基类对象还是派生类对象?
- 基类和派生类之间的同名函数,存在重载吗?
- 基类和派生类之间的同名函数处理方式
- $jquery.ajax 访问数据库 php html 等。
- jquery 选择奇偶行。
- JQuery中$.ajax()方法参数详解
- JQuery -- this 和 $(this) 的区别
- 数据结构7—线索二叉树 (java)
- 基类中this指针和派生类对象的关系,同名隐藏原则和作用域的示例
- jquery css()方法
- GourdScan被动扫描环境搭建
- jquery ajax 单击修改文档
- app跳转到应用市场打分
- 微信接口 菜单 40016
- arclist标签时,想按照权重越大越靠前来排序(58nin.com原创)
- vps服务器外网网站打不开
- 织梦5.7系统dede:likearticle标签使用教程|