C++ by
itself does not have a feature for dynamic runtime class
information. But Microsoft solved this problem by
providing a CRuntimeClass.
This structure can be used for dynamic runtime class
information, extra type checking of function arguments
or when we have to write some special purpose code based
on the class of an object.
This CRunitmeClass
is a structure and does not have a base class. All the
classes derived from the MFC root class CObject, are
associated with CRuntimeClass
structure. This CRuntimeClass
provides runtime class information (such as pointer to
the object, ASCII name of the class etc) about the
associated classes. This structure also implements
various functions that can be used to dynamically create
objects, specifying the type of object by using a
familiar name, and determining if the related class is
derived from a specific class.
To use this CRuntimeClass,
the class for which the runtime information is to be
deduced should use DECLARE_DYNAMIC and IMPLEMENT_DYNAMIC
macros. Also the class must have been derived from
CObject. There are two more important functions, which
can be used in association with the CRuntimeClass.
One function is IsKindOf
and the other one is GetRuntimeClass.
IsKindOf:
This IsKindOf
function tests if an object is of a particular class
type and returns TRUE or FALSE. This could be important
runtime class information based on which certain
business logic can be decided.
The header file should use DECLARE_DYNAMIC
macro inside the class for making it aware of CRuntimeClass
structure.
//MyClass.h
class MyClass :public CObject
{
DECLARE_DYNAMIC(MyClass)
public:
MyClass(){}
};
The source file (.cpp) should call IMPLEMENT_DYNAMIC(Derivedclass,
rootclass) for using CRuntimeClass.
This completes the runtime class information basic
formalities. After this we can use IsKindof function or
GetRuntimeClass for getting our much needed runtime
class information.
//MyClass.cpp
IMPLEMENT_DYNAMIC(
MyClass, CObject )
void MyFunction()
{
CObject *mObject =
new MyClass;
if(mObject->IsKindOf(RUNTIME_CLASS(
MyClass) ) )
{
printf("Class is of type MyClass\n");
}
else
{
printf("Class is of type someotherclass\n");
}
}
GetRuntimeClass:
This function returns a pointer to CRuntimeClass,
which can be used to retrieve the name of the class.
char strClassName[256];
MyClass obj;
CRuntimeClass
*myClass ;
myClass = obj.GetRuntimeClass();
strcpy(strClassName,myClass->lpszClassName);
It is to be noted that the use of CRunTimeClass
for type checking at run time is against the rule of
virtual functions on inheritance. But this can be used
to write some special purpose code where some type
checking is needed.