Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2707639
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4193
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: C/C++

2007-11-13 21:56:34

MFC中,我们见识了MFCRTTI的实现,在MFC中,使用CruntimeClass以及DECLARE_DYNAMICDECLARE_IMPLEMENT宏等实现的RTTI功能相当强大,但是在我们一般的程序中还用不着这么复杂的RTTI,在C++标准中提供的typeid操作符和type_info信息提供的RTTI支持就相当的简单,只是简单的比较两个类对象和指针是否属于同一类;而对于我们平时简单的应用,这些也足够了;要使用C++标准提供的RTTI功能,必须要求编译器打开GR编译选项,但是在一些嵌入式开发中,我们无法使用这个编译选项,那么我们就得自己模拟实现一个RTTI,以下就是我的一个实现:它根据一个类继承中的类的名字来判断一个指针是属于哪个类,依靠虚函数来完成功能,最后抽象到一个宏实现整个RTTI。具体编码如下:

 
#include "stdafx.h"
#include
#include
using namespace std;


//使用这个宏来为我们的类生成一个返回类名字的虚函数
#define DECLARE_RTTI(ClassName) \
public: \
 virtual PCHAR GetClassName() \
{ \
 printf("%s\n",#ClassName);\
 return #ClassName; \
}
//类体系中的基类,实现一个IsKindOf方式,可以根据类名判断类
class Base
{
 DECLARE_RTTI(Base)
public:
 BOOL IsKindOf(PCHAR szClassName)
 {
  if (0 == strcmp(GetClassName(), szClassName))
  {
   return TRUE;
  }
  return FALSE;
 }
};

class Derive : public Base
{
 DECLARE_RTTI(Derive)
public:

};

//这个函数只得到一个基类指针,它可以根据这个指针知道到底是哪个来的指针
void Test(Base * p)
{
 if (p->IsKindOf("Base"))
 {
  printf("This is the base class pointer!\n");
 }
 else if (p->IsKindOf("Derive"))
 {
  printf("This is the derive class pointer!\n");
 }
 else
 {
  printf("This is the new derived class: %s\n", p->GetClassName());
 }
}

//派生类
class DeriveEx : public Derive
{
 DECLARE_RTTI(DeriveEx)
};


#define D
#ifdef D
int _tmain(int argc, _TCHAR* argv[])
{
 DeriveEx obj; //你可以在这里变换类,看输出结果了
 Test(&obj);
 
 return 0;
}

#endif

阅读(1187) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~