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)
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.