MFC关键技术模拟(4)------类型识别

        接上一篇:MFC关键技术模拟(3)------RTTI

        在上一篇RTTI里面已经实现了类型识别链表。在它的基础上再来实现类型的识别就相对比较容易了。

所有类的继承图表:


1.IsKindOf()函数的实现

     在CObject类里面添加一个IsKindOf()函数。因为CObject类是所有类的根源。那么这个CObject类就会被继承到各个子类中。在IsKindOf()函数中比对传入的参数类是否和当前类一致就可以识别这个类的型别了。添加的IsKindOf()函数如下:

	BOOL IsKindOf(const CRuntimeClass *pClass) const
	{
		CRuntimeClass* pClassThis = GetRuntimeClass(); //获取当前类的CRuntimeClass对象指针
		while(pClassThis != NULL)                      //当前类的CRuntimeClass指针不为空
		{
			if(pClassThis == pClass)//比较参数所指类的CRuntimeClass对象指针是否和当前类CRuntimeClass对象指针一致
			{
				return TRUE;                   //一致时返回TRUE
			}
			pClassThis = pClassThis->m_pBaseClass; //当前类指针指向其基类,循环再做比较       
		}
		return FALSE;                                  //直至其基类再没有任何的基类
	}

2.IsKindOf()函数的调用

       要识别出某个类的类型,直接调用IsKindOf()函数就可以了。

       在main函数中声明一个CMyDoc的对象指针,然后按照类的继承图表依次检查类型。

	CMyDoc* pMyDoc = new CMyDoc;

	cout<<"CObject\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CObject))<<endl;
	cout<<"CCmdTarget\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CCmdTarget))<<endl;
	cout<<"CWinThread\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CWinThread))<<endl;
	cout<<"CWinApp\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CWinApp))<<endl;
	cout<<"CMyWinApp\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyWinApp))<<endl;
	cout<<"CWnd\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CWnd))<<endl;
	cout<<"CView\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CView))<<endl;
	cout<<"CMyView\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyView))<<endl;
	cout<<"CFrameWnd\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CFrameWnd))<<endl;
	cout<<"CMyFrameWnd\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyFrameWnd))<<endl;
	cout<<"CDocument\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CDocument))<<endl;
	cout<<"CMyDoc\t\t"<<pMyDoc->IsKindOf(RUNTIME_CLASS(CMyDoc))<<endl;
 
程序运行结果: 



        比对类的继承图表,由于CMyDoc类继承的是CDocument类,CDocument类继承CCmdTarget类,CCmdTarget类继承CObject类。所以结果显示是这样。

3.调试中的问题

       你在程序编译时如果出现无法打开写入exe,可以查看是否程序结果正在运行,在进程中杀死它即可。如果进程中没有运行,有可能是杀毒软件在作怪。关闭杀毒软件,然后编译运行,或者重启后关闭杀毒软件再编译运行。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值