MFC 详解一之重要的类

最近好久没用vs下的mfc工程了,感觉对于mfc越来越感到莫名的陌生不了解,网上也看到好多关于mfc的深入了解的博客,其中liyi268这位前辈对于mfc六大机制总结的很到位,还有就是《深入浅出 MFC》侯俊杰的这本书更是没话说,一直犹豫要不要写mfc方面的博客,最终想想为什么不写呢,也许自身的水平有限,也许投入写mfc博客的时间会比较长,但是自身总结一方面能加深印象,促使自己更加深入的了解,一方面也希望大神们给予指证,发现一些自身没发现的问题。

正文开始前,想先总结下mfc类层次关系中几个重要的类和它里面一些重要的函数作用


一:CObject :

CObject 是大多数MFC类的根类或基类。CObject类有很多有用的特性:对运行时类信息的支持,对动态创建的支持,对串行化的支持,对象诊断输出,以下是摘自mfc里的CObject类的一部分

class AFX_NOVTABLE CObject
{
public:
	virtual CRuntimeClass * GetRuntimeClass() const; // (1)
	public:
	// 与运行时类信息、串行化相关的函数
	BOOL IsSerializable() const;
	BOOL IsKindOf(const CRuntimeClass* pClass) const;// (2)
	// Overridables
	virtual void Serialize(CArchive& ar);// 

#if defined(_DEBUG) || defined(_AFXDLL)

virtual void AssertValid() const;//
virtual void Dump(CDumpContext& dc) const;
#endif	
public:
	static const CRuntimeClass classCObject;  
#ifdef _AFXDLL
	static CRuntimeClass* PASCAL _GetBaseClass();
	static CRuntimeClass* PASCAL GetThisClass();
#endif

};

接下来对CObject做一些简单的解析

(1): CRuntimeClass在MFC中定义为一个数据结构,在文件AFX.H中声明,它是用来串起MFC从CObject继承下来的所有类(相当于一根绳,只要你牵住绳的一头你就可以得到绳上的所有数据)通过关联(即通过链表的方法连接起来)CRuntimeClass对象从而能在运行时得到类的实例或者它的基类

每个从CObject中派生的类都有一个CRuntimeClass对象同它关联以完成在运行时得到类实例的信息或者是它的基类。 在afx.h中CRuntimeClass的定义如下:

struct CRuntimeClass
{
	LPCSTR m_lpszClassName; //类名
	int m_nObjectSize; //包含CRuntimeClass对象的类sizeof的大小
	UINT m_wSchema; // 分类编号(对不可分类的类,该值为-1)。
	CObject* (PASCAL* m_pfnCreateObject)(); // 指向一个建立实例的构造函数,创建一个类的对象,抽象类则返回NULL,运行时类型识别时返回的是NULL,而动态创建有效
	// CObject*(* m_pfnCreateObject)(); 指向函数的指针 如:int (*fn)();

#ifdef _AFXDLL
	CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();//是一个指向函数的指针,该函数返回基类的CRuntimeClass结构。 
#else
	CRuntimeClass* m_pBaseClass; // 如果你的应用程序是静态地链接到MFC的,则是一个指向基类的CRuntimeClass结构的指针。
#endif

	//以上m_pBaseClass的指针(函数)是MFC运行时确定类层次的关键,它一个简单的单向链表

	CObject* CreateObject(); //这个函数给予CObject派生类运行时动态建立的能力,从CObject派生的类可以支持动态创建,这是在运行时创建一个指定类的对象的能力
	//例如,文档,视和框架类就应该支持动态创建。CreateObject成员函数可以用来实现这个功能,在运行时为这些类创建对象。

	BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;   //判断是不是一个基类的子类
	//使用它可以判断某类是否是从pBaseClass指向的类在派生来。*/
	
	void Store(CArchive& ar) const;
	static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);

	CRuntimeClass* m_pNextClass; // linked list of registered classes
};

m_pBaseClass指向基类的CRuntimeCla

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值