MFC中关于运行时类信息及动态创建对象的两个宏的意义(转)
http://blog.csdn.net/ligand/article/details/49839507
MFC运行时类信息
用途:
程序在运行时,获取对象类的信息及类的继承关系
实现:
1、定义的类必须继承自CObject类。
2、类内声明宏DECLARE_DYNAMIC(),类外实现宏IMPLEMENT_DYNAMIC()
3、使用:
- BOOL CObject::IsKindOf(CRuntimeClass* pClass)//对象是否属于某个类
- CRuntimeClass* GetRuntimeClass( );//获取对象运行时类信息,经常使用RUNTIME_CLASS(类名)代替。
示例:
- class CAnimal:public CObject
- {
- DECLARE_DYNAMIC(CAnimal)
- };
- IMPLEMENT_DYNAMIC(CAnimal,CObject)
- class CDog:public CAnimal
- {
- DECLARE_DYNAMIC(CDog)
- };
- IMPLEMENT_DYNAMIC(CDog,CAnimal)
- int main(int argc, char* argv[])
- {
- printf("Hello World!\n");
- CDog dog;
- if(dog.IsKindOf(RUNTIME_CLASS(CAnimal)))
- {
- printf("dog is an animal\n");
- }
- CAnimal animal;
- CRuntimeClass* rt=animal.GetRuntimeClass();
- printf("运行时类信息,类名:%s,大小:%d,版本:%d\n",rt->m_lpszClassName,rt->m_nObjectSize,rt->m_wSchema);
- if(animal.IsKindOf(rt))
- {
- printf("animal is an animal\n");
- }
- return 0;
- }
动态创建对象
作用和意义:
一般编程时,使用系统的类定义对象,调用对象的成员函数完成相关的功能。有了动态创建,由用户定义类,系统函数创建该类的对象,由底层代码创建上层类的对象。
实现:
1、定义类必须继承自CObject类。
2、类内声明宏DECLARE_DYNCREATE,类外实现宏IMPLEMENT_DYNCREATE
3、使用:
实例:
- class CAnimal:public CObject
- {
- DECLARE_DYNCREATE(CAnimal)
- };
- IMPLEMENT_DYNCREATE(CAnimal,CObject)
- class CDog:public CAnimal
- {
- DECLARE_DYNCREATE(CDog)
- };
- IMPLEMENT_DYNCREATE(CDog,CAnimal)
- //定义动态创建对象的函数
- void CreateInstance(CRuntimeClass* pClass)
- {
- CObject *pObj=pClass->CreateObject();
- printf("对象地址:%p\n",pObj);
- printf("类名:%s\n",pClass->m_lpszClassName);
- delete pObj;
- }
- int main(int argc, char* argv[])
- {
- printf("Hello World!\n");
- CreateInstance(RUNTIME_CLASS(CDog));
- return 0;
- }
具体实现细节
类继承体系中每个类都定义一个CRuntimeClass类型的静态数据成员,并定义静态成员函数 _GetBaseClass、GetThisClass及虚函数GetRuntimeClass。
- struct CRuntimeClass
- {
- // Attributes
- LPCSTR m_lpszClassName;
- int m_nObjectSize;
- UINT m_wSchema; // schema number of the loaded class
- CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
- #ifdef _AFXDLL
- CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
- #else
- CRuntimeClass* m_pBaseClass;
- #endif
- // Operations
- CObject* CreateObject();
- BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
- // dynamic name lookup and creation
- static CRuntimeClass* PASCAL FromName(LPCSTR lpszClassName);//搜AfxGetModuleState()->m_classList,如果不成功再search classes in shared DLLs, 即pModuleState->m_libraryList->m_classList
- static CRuntimeClass* PASCAL FromName(LPCWSTR lpszClassName);
- static CObject* PASCAL CreateObject(LPCSTR lpszClassName);//从类名字符串,用FromName返回对应的CRuntimeClass,然后调用CRuntimeClass的成员函数CreateObject()
- static CObject* PASCAL CreateObject(LPCWSTR lpszClassName);
- // Implementation
- void Store(CArchive& ar) const;
- static CRuntimeClass* PASCAL Load(CArchive& ar, UINT* pwSchemaNum);//从CArchive读入类名字符串,然后返回对应的CRuntimeClass的对象。
- // CRuntimeClass objects linked together in simple list
- CRuntimeClass* m_pNextClass; // linked list of registered classes
- const AFX_CLASSINIT* m_pClassInit;
- };
MFC中关于运行时类信息及动态创建对象的两个宏的意义(转)的更多相关文章
- 在Amazon FreeRTOS V10中使用运行时统计信息
在MCU on Eclipse网站上看到Erich Styger在8月2日发的博文,一篇关于在Amazon FreeRTOS V10中使用运行时统计信息的文章,本人觉得很有启发,特将其翻译过来以备参考 ...
- Visual C++中对运行时库的支持
原文地址:http://blog.csdn.net/wqvbjhc/article/details/6612099 一.什么是C运行时库 1)C运行时库就是 C run-time library,是 ...
- Java:日历类、日期类、数学类、运行时类、随机类、系统类
一:Calendar类 java.util 抽象类Calendar 1.static Calendar getInstance()使用默认时区和语言环境获得一个日历. 2. int get(int ...
- 是否含有RTTI(运行时类型信息)是动态语言与静态语言的主要区别
运行时类型信息代表类型信息和对内存的操作能力. 运行时类型信息是运行时系统的基础. 类型信息分为编译时类型信息和运行时类型信息两种: 静态语言的类型信息只在编译时使用和保留,在可执行文件中没有类型信息 ...
- 【JavaSE】运行时类型信息(RTTI、反射)
运行时类型信息使得你可以在程序运行时发现和使用类型信息.--<Think in java 4th> **** 通常我们在面向对象的程序设计中我们经常使用多态特性使得大部分代码尽可能地少了解 ...
- [C++]C++中的运行时类型检测
Date:2014-1-3 Summary: 使用C++中的运行时类型检测.(文章重点在于记录本人的使用情况,并非深层讨论RTTI) Contents:写习惯C#的我,在C++依然存在哪些.NET的惯 ...
- 翻译:JVM虚拟机规范1.7中的运行时常量池部分(二)
本篇为JVM虚拟机规范1.7中的运行时常量池部分系列的第二篇. 4.4.4. The CONSTANT_Integer_info and CONSTANT_Float_info Structures ...
- java 面向对象(四十二):反射(六)反射应用三:调用运行时类的指定结构
调用指定的属性: @Test public void testField1() throws Exception { Class clazz = Person.class; //创建运行时类的对象 P ...
- java 面向对象(四十一):反射(五)反射应用二:获取运行时类的完整结构
我们可以通过反射,获取对应的运行时类中所有的属性.方法.构造器.父类.接口.父类的泛型.包.注解.异常等....典型代码: @Test public void test1(){ Class clazz ...
随机推荐
- 苹果手机的SB系列(1)听不懂人话的sir
写在前面,因手买错了(至于怎么买错了不解释)手机才买了一个苹果,价格不扉,但实在让人很不爽.记下了SB的点点. Sir听不懂人话,我让他查非洲安哥拉的时间,却屡次返回美国安哥拉洲的时间,很自恋.
- 二叉树之AVL树
高度为 h 的 AVL 树,节点数 N 最多2^h − 1: 最少N(h)=N(h− 1) +N(h− 2) + 1. 最少节点数n 如以斐波那契数列可以用数学归纳法证明: 即: N(0) = 0 ( ...
- css三种基本选着器
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- Spring-----入门
Spring 入门 一.首先导入核心jar包 commons-logging-1.1.3.jar 日志 spring-beans-4.2.4.RELEAS ...
- awk命令总结
强大的文本处理工具,awk读取文件内容的每一行时,将对比该行是否与给定的模式相匹配,匹配则执行处理过程,否则对该行不处理. 序号 awk功能 例子 1 指定分隔符显示某几列 2 通过正则表达式取出 ...
- 【Java集合系列五】HashMap解析
2017-07-31 19:36:00 一.简介 1.HashMap作用及使用场景 HashMap利用数组+单向链表的方式,实现了key-value型数据的存储功能.HashMap的size永远是2^ ...
- Data assimilation
REF: https://en.wikipedia.org/wiki/Data_assimilation Data assimilation is the process by which obser ...
- HashMap jdk1.8 jdk1.7 put改动
之前hashmap处理冲突单纯使用链表法进行链接,1.8中,当一散列值中对应的链表长度超过8个后,会将链表转化为红黑树进行存储. 1.8中源码 public V put(K key, V value) ...
- 定义一个Map集合,key和value不规定类型,任意放入数据,用keySet()和 entrySet()两种方式遍历出Map集合的数据
package com.lanxi.demo1_1_1; import java.util.HashMap; import java.util.Iterator; import java.util.M ...
- [2003_p1]乒乓球
一道因为输出不一样疯狂超时的题目(是我太菜,但是我jio得代码是ok的) 题目描述 国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及.其中11分制改革引起了很大的 ...