CRuntimeClass中的一个问题

vchalf_moon 2008-04-17 08:47:19
CRuntimeClass* pRuntimeClass = RUNTIME_CLASS(CPerson)
//Cperson有一个缺省构造函数
CObject* pObject = pRuntimeClass->CreateObject();
是调用哪里的函数,
其中CRuntimeClass
Struct CRuntimeClass
{
CObject* (PASCAL* m_pfnCreateObject)();
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)();
CRumtieClass* m_pBaseClass;
CObject *CreateObject();
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
...
}
难道是调用了上面这个CreateObject()函数;

...全文
47 点赞 收藏 5
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
jameshooo 2008-04-17
所谓的序列化只是一个框架,MFC也针对它自身提供的基本类实现了序列化。自定义类需要实现Serialize方法来实现自身的序列化,其实处理起来非常简单的,按照自己设定的顺序把每个成员变量执行一次流入流出操作即可,部分成员不参与序列化也可以。
回复
vchalf_moon 2008-04-17
高人指点一下序列化是怎么实现的
里面的东西看不懂
回复
jameshooo 2008-04-17
所谓运行时类,就是这个类会在全局运行时类链表中添加一项自己的记录,通过名称“CMyClass”来映射自己的CRuntimeClass指针,其它人就能找到你的运行时信息并利用它创建你的类。再看看RUNTIME_CLASS宏的定义
回复
jameshooo 2008-04-17
CRuntimeClass是MFC实现的RTTI(运行时类型信息),MFC中的很多类需要由框架动态创建(比如文档、视图、框架窗口类等等),所以从CObject继承的类如果需要这种能力,必须实现它的CRuntimeClass,包括CreateObject静态方法(这个方法简单调用new CMyClass)。而做到这个很简单,使用DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC宏就自动拥有这个特性,看看这两个宏的定义就能理解其原理。
回复
vchalf_moon 2008-04-17
我自己写吧CRuntimeClass* pRuntimeClass = RUNTIME_CLASS(CPerson)
其中pRuntimeClass 是指向CPerson类中的CRuntimeClass成员classCPerson=class##classname;
CObject* pObject = pRuntimeClass->CreateObject(); 就是调用classCPerson结构中的CreateObject函数
classCPerson结构中的CreateObject函数实际上又调用了结构中的CObject* (PASCAL* m_pfnCreateObject)(); 函数,m_pfnCreateObject实际上指向了子类中的CreateObject()函数

CreateObject()函数在IMPLEMNET宏中已经被定义{return new classname}也就是{return new CPerson};

动态创建就是因为静态成员在WINMAIN之前会被初始化
而在动态创建类中都声明了一个CRuntimeClass class##classname( 这个例子这个名字就是classCPerson)

CRuntimeClass class##classname要被初始化,因而会产生一个new classname
就是new CPerson对像(这个CPerson类要有一个无参数的构造函数就是因为这里要用到)

好像还有...高人补一下动态创建的其他信息
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2008-04-17 08:47
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……