65.9K
CodeProject is changing. Read more.
Home

Emulation of CRuntimeClass for non-CObject derived classes

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.20/5 (3 votes)

Feb 21, 2010

CPOL
viewsIcon

23022

downloadIcon

80

MACROs having advantage of CRuntimeClass for non-CObject derived classes.

Introduction

Let's assume you decided to create a hierarchy of non-CObject derived classes using the CRuntimeClass of MFC libraries (and DECLARE_DYNAMIC IMPLEMENT_DYNAMIC DECLARE_DYNCREATE IMPLEMENT_DYNCREATE as well). It is implied that your base class is named like CXxx (C + class prefix) and all your child classes have names according to the rule: C+ class prefix + kind_name (for example, CXxxCool, CXxxAdvanced, CXxxSuper etc.). You need to have a static function Create(string kind_name) to create objects at runtime and a function GetKind returning a string with a 'kind_name' of the object.

Background

Unlike CRuntimeClass (actually it is a structure), our 'CKindOf...' class exists as MACROs DECLARE_KIND_OF(class_name) and IMPLIMENT_KIND_OF(class_name), and every generated 'KindOf' class corresponds with a given class hierarchy.

DECLARE_KIND_OF(Xyz)

IMPLIMENT_KIND_OF(Xyz)

Using the code

The base class of your hierarchy should use the DECLARE_BASE_DYNCLASS(class_name) and IMPLIMENT_BASE_DYNCLASS(class_name) MACROs.

class CXyz
{

public:
    CXyz();
DECLARE_BASE_DYNCLASS(Xyz)
};

IMPLIMENT_BASE_DYNCLASS(Xyz)
CXyz::CXyz()
{

}

And every child class should use DECLARE_CHILD_DYNCLASS(class_name,kind_name) and IMPLIMENT_CHILD_DYNCLASS(class_name,kind_name,parent_name).

class CXyzCool:public CXyz
{
  DECLARE_CHILD_DYNCLASS(Xyz,Cool)
};

IMPLIMENT_CHILD_DYNCLASS(Xyz,Cool,Base)

class CXyzAdv:public CXyzCool
{
  DECLARE_CHILD_DYNCLASS(Xyz,Adv)
};

IMPLIMENT_CHILD_DYNCLASS(Xyz,Adv,Cool)

If your child class is derived directly from the base class (the second level in the class hierarchy), use the 'Base' keyword as the third argument.

IMPLIMENT_CHILD_DYNCLASS(Xyz,Cool,Base)

And the prefix of the base class otherwise:

IMPLIMENT_CHILD_DYNCLASS(Xyz,Adv,Cool)