说明:1. 在本文中,我们在析构函数中用printf代替cout, 至于具体原因,之前的博文已经讲过,这里不再赘述。

2. 仿真是在Windows Console上进行的。

在仿真MFC类层次结构之前,我们先来复习一下与this指针相关的一个典型程序:

#include <iostream>
using namespace std;class Base
{
public:Base *pB;Base(){pB = this;cout << "Base Constructor" << endl;}virtual void fun(){cout << "Base fun" << endl;}
};class Derived : public Base
{
public:Derived(){cout << "Derived Constructor" << endl;}virtual void fun(){cout << "Derived fun" << endl;}
};Derived d;Base *getPointer()
{return d.pB;
}int main()
{Base *p = getPointer();p->fun();return 0;
}

结果为:

Base Constructor
Derived Constructor
Derived fun
        可见,this绑定的是派生类Derived的对象。

下面,我们来仿真MFC类的层次结构图(在Windows Console上仿真),程序如下:

#include <iostream>
using namespace std;// MFC的类程序
class CObject
{
public:CObject()  {cout << "CObject Constructor \n";}~CObject() {printf("CObject Destructor \n");}
};class CCmdTarget : public CObject
{
public:CCmdTarget() {                     cout << "CCmdTarget Constructor \n";}~CCmdTarget() {               printf("CCmdTarget Destructor \n");}
};class CWinThread : public CCmdTarget
{
public:CWinThread()  {cout << "CWinThread Constructor \n";}~CWinThread(){printf("CWinThread Destructor \n");}
};class CWinApp : public CWinThread
{
public:CWinApp* m_pCurrentWinApp;CWinApp()  {cout << "CWinApp Constructor \n";m_pCurrentWinApp = this; // this绑定全局对象theApp}~CWinApp(){printf("CWinApp Destructor \n");}
};// 应用程序
class CMyWinApp : public CWinApp
{
public:CMyWinApp()   {cout << "CMyWinApp Constructor \n";}~CMyWinApp()  {printf("CMyWinApp Destructor \n");}
};CMyWinApp theApp;     // 全局对象CWinApp* AfxGetApp()  // 全局函数
{return theApp.m_pCurrentWinApp;
}int main()
{CWinApp* pApp = AfxGetApp(); // pApp绑定了theApp对象return 0;
}

结果为:

CObject Constructor
CCmdTarget Constructor
CWinThread Constructor
CWinApp Constructor
CMyWinApp Constructor
CMyWinApp Destructor
CWinApp Destructor
CWinThread Destructor
CCmdTarget Destructor
CObject Destructor
       对比上述程序和MFC的实际框架,就发现两者有异曲同工之妙。

为了进一步证实pApp的确是绑定了theApp对象,我们来测试一下,程序如下:

#include <iostream>
using namespace std;// MFC的类程序
class CObject
{
public:virtual void print(){cout << "CObject" << endl;}
};class CCmdTarget : public CObject
{
public:virtual void print(){cout << "CCmdTarget" << endl;}
};class CWinThread : public CCmdTarget
{
public:virtual void print(){cout << "CWinThread" << endl;}
};class CWinApp : public CWinThread
{
public:CWinApp* m_pCurrentWinApp;CWinApp()  {m_pCurrentWinApp = this; // this绑定全局对象theApp}virtual void print(){cout << "CWinApp" << endl;}
};// 应用程序
class CMyWinApp : public CWinApp
{
public:virtual void print(){cout << "CMyWinApp" << endl;}
};CMyWinApp theApp;     // 全局对象CWinApp* AfxGetApp()  // 全局函数
{return theApp.m_pCurrentWinApp;
}int main()
{CWinApp* pApp = AfxGetApp(); // pApp指向了theApp对象pApp->print();return 0;
}

结果为:

CMyWinApp

MFC类层次结构仿真(参考了侯俊杰的《深入浅出MFC》)相关推荐

  1. MFC程序初始化过程仿真(参考了侯俊杰的《深入浅出MFC》)

    下面的Windows Console程序是 MFC程序初始化过程的仿真,如下: #include <iostream> using namespace std;// MFC类 class ...

  2. MFC之RTTI分析(基于侯俊杰的《深入浅出MFC》)

    2019独角兽企业重金招聘Python工程师标准>>> MFC框架早在标准C++之间提出并实现了类的运行时识别(RTTI)功能,下面记录下基于我对其的理解. 要实现RTTI必须在定义 ...

  3. 读侯俊杰的《深入浅出MFC》小记

    1.程序必须在产生窗口之前先利用API函数RegisterClass设定属性(我们称此操作为注册窗口类) 2.消息循环中的TranslateMessage是为了将键盘消息转化,DispatchMess ...

  4. MFC 类层次结构图

    下图表示派生自 MFC 类CObject: 下图表示派生自 MFC 类CWnd和CCmdTarget: 下图表示不是派生自 MFC 类CObject: 层次结构图类别 官方下载链接:MFC 层次结构图 ...

  5. 深入浅出mfc学习笔记——六大关键技术之仿真_运行时和动态创建

    1:PS88:MFC的类层次结构 <1>CObject <2>CCmdTarget,CDocument <3>CCmdTarget_CWinThread_CWinA ...

  6. hibernate 继承_Hibernate继承:每个类层次结构的表

    hibernate 继承 在本教程中,我们将了解如何在hibernate中实现继承.可以通过3种方式在hibernate中实现继承.在本文中,我们将看到其中一种,即每个类层次结构一个表. Hibern ...

  7. Hibernate继承:每个类层次结构的表

    在本教程中,我们将看到如何在hibernate中实现继承.有3种方法可以在hibernate中实现继承.在本文中,我们将看到其中一种,即每个类层次结构一个表. 休眠中的继承: Java是面向对象的语言 ...

  8. SolidWorks二次开发类层次结构

    SolidWorks 2008 API是由组成组成SolidWorks 2008软件的COM组件提供的. 对象模型结构简介: SldWorks对象最为根本,有他可以直接或间接的访问多有其他对象 部分对 ...

  9. 在JavaScript里写类层次结构?别那么做!

    从理论上讲,JavaScript并没有类.在实践中,下面的代码片段被广泛认为是JavaScript"类"的一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...

最新文章

  1. zenmap nmap输出无显示_液晶显示器高压板坏的现象及维修思路 。
  2. 20165214 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9
  3. python数据分析_使用Python进行数据分析
  4. java ee junit_JavaEE——Junit
  5. phpul 无序列表,PHP – 简单嵌套无序列表(UL)数组
  6. ListDictionary:改进的OrderedDictionary
  7. 安全行业最全防火墙产品全家福
  8. Linux crontab 详细介绍及执行php
  9. jq移除一条html语句,jquery html()删除脚本标签
  10. 【参赛作品19】【openGauss】gsql客户端工具(二)gsql客户端工具之Data Studio客户端工具
  11. 云计算平台的市场现状和云计算平台的核心价值是什么?
  12. 仿qq局域网聊天软件 c++ 非mfc 数据库
  13. 《心灵捕手》中的10段经典台词(10 classic lines from Good Will Hunting)
  14. 手机百度脑图app_百度脑图下载-百度脑图app手机安卓版下载-沧浪手游
  15. Wishbone总线快速了解
  16. 「教师资格证定期注册」相关答疑
  17. ipad怎么分屏方法
  18. 转载:Python 的关键字 yield 有哪些用法和用途?
  19. QT报错cannot find -lxxx(xxx为被调模型)和undefined reference to’_imp__ZN11/14xxx(xxx为自己定义)
  20. Android 手游聚合SDK那些事

热门文章

  1. rocketmq之源码分析及关键技术解析目录(一)
  2. GPT磁盘与MBR磁盘区别
  3. 怎么剪切视频中的一部分?不如试试这个软件
  4. 求助 TSI APS-3321 用R232线与电脑连接后,AIM软件打开后无法与设备通信的原因
  5. 删除带头结点单链表中倒数第k个结点
  6. 从一道笔试题谈算法优化(上)
  7. 六年团队Leader实战秘诀|程序员最重要的八种软技能
  8. Meltdown漏洞和KPTI补丁如何影响机器学习性能?
  9. 视频怎么转音频mp3,其实非常简单
  10. wordpress自适应表格_wordpress响应式移动端完美自适应宽屏主题