长相依原唱播放:IMPLEMENT

来源:百度文库 编辑:九乡新闻网 时间:2024/10/05 21:35:19

仍有疑问:红色部分

 

使用DECLARE——DYNCREATE宏时,使能Cobject派生类的对象在运行时动态被创建。

 

IMPLEMENT_DYNCREATE(class_name, base_class_name )

 

Parameters

class_name

派生类名.

base_class_name

基类名.

Remarks

框架使用这种技巧动态的创建新的对象。如,序列化时,从盘中读一个对象。在类实现的文件中添加宏IMPLEMENT_DYNCREATE. For more information, see CObject Class Topics.

如果你使用了DECLARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏, 你可以使用RUNTIME_CLASS 宏和 CObject::IsKindOf 成员函数去决定是否在运行时中创建宏.

如果类声明的文件中包含有DECLARE_DYNCREATE, 类实现的文件中必须有 IMPLEMENT_DYNCREATE.

Example

 

/* CAge.h */

class CAge : public CObject

{

     int num;

public:

     DECLARE_DYNCREATE(CAge)

};

//==============

/* CAge.cpp */

#include "stdafx.h"

#include "CAge.h"

IMPLEMENT_DYNCREATE(CAge, CObject)

CObject 成员函数 IsKindOf 可用于确定具体某个对象是属于特定类还是从特定类派生。IsKindOf 的参数是 CRuntimeClass 对象,使用带类名的 RUNTIME_CLASS 宏可获取该参数。

  • 对于类 CObject,如下所示使用带类名的 RUNTIME_CLASS 复制代码
    CRuntimeClass* pClass = RUNTIME_CLASS( CObject );

很少需要直接访问运行时类对象。更常用的方法是将运行时类对象传递到 IsKindOf 函数,如下一过程所示。IsKindOf 函数测试对象,确定对象是否属于特定类。

  1. 确保类具有运行时类支持。即类必须是直接或间接从 CObject 派生,且使用从 CObject 派生类章节中解释的 DECLARE_DYNAMICIMPLEMENT_DYNAMICDECLARE_DYNCREATEIMPLEMENT_DYNCREATEDECLARE_SERIALIMPLEMENT_SERIAL 宏。
  2. 如下所示,为该类的对象调用 IsKindOf 成员函数,并使用 RUNTIME_CLASS 宏生成 CRuntimeClass 参数:
    // in .H file                                class CPerson : public CObject                                {                                DECLARE_DYNAMIC( CPerson )                                public:                                CPerson(){};                                // other declaration                                };                                // in .CPP file                                IMPLEMENT_DYNAMIC( CPerson, CObject )                                void SomeFunction(void)                                {                                CObject* pMyObject = new CPerson;                                if(pMyObject->IsKindOf( RUNTIME_CLASS( CPerson ) ) )                                {                                //if IsKindOf is true, then cast is all right                                CPerson* pmyPerson = (CPerson*) pMyObject ;                                ...                                delete pmyPerson;                                }                                ...                                delete [MyObject];                                }
    IsKindOf 返回 TRUEIsKindOf 不支持多重继承或虚基类,但如有必要,可对派生的 Microsoft 基础类使用多重继承。