孙鑫VC++ 第三课 this指针的问题
2017-04-01 22:55
239 查看
最近看一个古老但经典的VC++视频,看到第三课的时候,遇到一个小小的比较特殊的问题,就是子类的对象调用父类时,在父类里的this指针指向的是子类的对象。逻辑上感到有点混乱,用一段代码加以验证。
上面代码和孙鑫第三课中提到的this指针部分的MFC的代码原理一样!此代码运行的结果你会发现this的值都一样!而且this都是指向cb对象的! 因为this指针式在创建一个对象时,隐含的将对象的地址赋予一个指针,那就是this指针。在创建对象cb时,先讲cb的首地址赋给this,根据继承性,首先调用基类的构造函数,虽然此时cb对象还未完全创建(必须调用完子类的构造函数时,此时对象才会创建完毕),但是此时cb对象的基类部分已经构造完毕,所以这时候的this指针可以看成是cb的this指针,但是只能调用基类PARENT的数据成员。如果此时你在PARENT()里加上一句cout<<"b="<<this->b<<endl;让其调用子类的数据成员,则会报错!因为this指向的对象没有构造子类的部分!在执行完基类的构造函数进入子类的构造函数后,这时候this指向的对象构造完成,这时候this指针也就是一个真正的的指向cb的常指针了。
#include <iostream.h> class PARENT{ int d; public: PARENT() { d=1; cout<<"PARENT this ="<<this<<endl; cout<<"d="<<this->d<<endl; } }; class CHILD : public PARENT { int b; public: CHILD():PARENT() { b=2; cout<<"CHILD this = "<<this<<endl; cout<<"b="<<this->b<<endl; } }; int main(int argc, char* argv[]) { CHILD cb; cout<<"CHILD object cb's addr is="<<&cb<<endl; return 0; }
上面代码和孙鑫第三课中提到的this指针部分的MFC的代码原理一样!此代码运行的结果你会发现this的值都一样!而且this都是指向cb对象的! 因为this指针式在创建一个对象时,隐含的将对象的地址赋予一个指针,那就是this指针。在创建对象cb时,先讲cb的首地址赋给this,根据继承性,首先调用基类的构造函数,虽然此时cb对象还未完全创建(必须调用完子类的构造函数时,此时对象才会创建完毕),但是此时cb对象的基类部分已经构造完毕,所以这时候的this指针可以看成是cb的this指针,但是只能调用基类PARENT的数据成员。如果此时你在PARENT()里加上一句cout<<"b="<<this->b<<endl;让其调用子类的数据成员,则会报错!因为this指向的对象没有构造子类的部分!在执行完基类的构造函数进入子类的构造函数后,这时候this指向的对象构造完成,这时候this指针也就是一个真正的的指向cb的常指针了。
相关文章推荐
- MFC 孙鑫老师第二讲中有关this指针的问题
- this指针的问题
- a标签伪协议触发事件和onclick触发事件的this指针问题
- 孙鑫VC学习笔记:第十三讲 (五) 保存可串行化的类对象 如何获取文档与视类指针
- 在DOc的构造函数中得到VIew类指针引起的问题(GetActiveView()引起的Access Violation;this->GetFirstViewPosition()=NULL;ASSERT(AfxIsValidAddress(this, siz
- VC8下多线程环境中AfxGetMainWnd()返回空指针问题及解决方法
- javascript this 指针的使用及常见问题
- c++简单问题告知之this指针
- 关于this指针的传递问题总结
- C++下this指针实现机制分析(针对vc++ 6.0)
- 孙鑫VC++视频学习笔记之8: MFC中指针的获取
- [vc]CString 及char 指针的常见问题
- 关于孙鑫VC++ 第六章的一些问题
- 函数用参数为 结构体指针 在VC下出现的问题
- this指针访问成员函数问题
- this指针的一些问题
- 记一次vue2路由参数传递this指针问题
- 孙鑫VC学习笔记:第十三讲 保存可串行化的类对象 如何获取文档与视类指针
- 翻译《有关编程、重构及其他的终极问题?》——25.不要再用this指针和nullptr比较了
- java 构造函数 this指针问题