MFC类层次结构仿真(参考了侯俊杰的《深入浅出MFC》)
说明: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》)相关推荐
- MFC程序初始化过程仿真(参考了侯俊杰的《深入浅出MFC》)
下面的Windows Console程序是 MFC程序初始化过程的仿真,如下: #include <iostream> using namespace std;// MFC类 class ...
- MFC之RTTI分析(基于侯俊杰的《深入浅出MFC》)
2019独角兽企业重金招聘Python工程师标准>>> MFC框架早在标准C++之间提出并实现了类的运行时识别(RTTI)功能,下面记录下基于我对其的理解. 要实现RTTI必须在定义 ...
- 读侯俊杰的《深入浅出MFC》小记
1.程序必须在产生窗口之前先利用API函数RegisterClass设定属性(我们称此操作为注册窗口类) 2.消息循环中的TranslateMessage是为了将键盘消息转化,DispatchMess ...
- MFC 类层次结构图
下图表示派生自 MFC 类CObject: 下图表示派生自 MFC 类CWnd和CCmdTarget: 下图表示不是派生自 MFC 类CObject: 层次结构图类别 官方下载链接:MFC 层次结构图 ...
- 深入浅出mfc学习笔记——六大关键技术之仿真_运行时和动态创建
1:PS88:MFC的类层次结构 <1>CObject <2>CCmdTarget,CDocument <3>CCmdTarget_CWinThread_CWinA ...
- hibernate 继承_Hibernate继承:每个类层次结构的表
hibernate 继承 在本教程中,我们将了解如何在hibernate中实现继承.可以通过3种方式在hibernate中实现继承.在本文中,我们将看到其中一种,即每个类层次结构一个表. Hibern ...
- Hibernate继承:每个类层次结构的表
在本教程中,我们将看到如何在hibernate中实现继承.有3种方法可以在hibernate中实现继承.在本文中,我们将看到其中一种,即每个类层次结构一个表. 休眠中的继承: Java是面向对象的语言 ...
- SolidWorks二次开发类层次结构
SolidWorks 2008 API是由组成组成SolidWorks 2008软件的COM组件提供的. 对象模型结构简介: SldWorks对象最为根本,有他可以直接或间接的访问多有其他对象 部分对 ...
- 在JavaScript里写类层次结构?别那么做!
从理论上讲,JavaScript并没有类.在实践中,下面的代码片段被广泛认为是JavaScript"类"的一个例子: 1 2 3 4 5 6 7 8 9 10 11 12 13 1 ...
最新文章
- zenmap nmap输出无显示_液晶显示器高压板坏的现象及维修思路 。
- 20165214 2018-2019-2 《网络对抗技术》Exp6 信息搜集与漏洞扫描 Week9
- python数据分析_使用Python进行数据分析
- java ee junit_JavaEE——Junit
- phpul 无序列表,PHP – 简单嵌套无序列表(UL)数组
- ListDictionary:改进的OrderedDictionary
- 安全行业最全防火墙产品全家福
- Linux crontab 详细介绍及执行php
- jq移除一条html语句,jquery html()删除脚本标签
- 【参赛作品19】【openGauss】gsql客户端工具(二)gsql客户端工具之Data Studio客户端工具
- 云计算平台的市场现状和云计算平台的核心价值是什么?
- 仿qq局域网聊天软件 c++ 非mfc 数据库
- 《心灵捕手》中的10段经典台词(10 classic lines from Good Will Hunting)
- 手机百度脑图app_百度脑图下载-百度脑图app手机安卓版下载-沧浪手游
- Wishbone总线快速了解
- 「教师资格证定期注册」相关答疑
- ipad怎么分屏方法
- 转载:Python 的关键字 yield 有哪些用法和用途?
- QT报错cannot find -lxxx(xxx为被调模型)和undefined reference to’_imp__ZN11/14xxx(xxx为自己定义)
- Android 手游聚合SDK那些事