Объявление данных макросов в классе позволяет обратиться к информации о классе во время выполнения. То есть эти макросы просто дают возможность во время работы программы иметь информацию о типе класса. Вот их описание:
DECLARE_DYNAMIC( имя класса ) IMPLEMENT_DYNAMIC(имя класса, имя класса родителя ) // Имя класса фактическое не заключенного в кавычки.DECLARE_DYNAMIC в описании класса IMPLEMENT_DYNAMIC в реализации. IMPLEMENT_DYNAMIC заменяется на код C++ для получения информации времени выполнения. Если вы объявили эти макросы для класса, то можете обращаться к функции IsKindOf и макрокоманде RUNTIME_CLASS. Вот выдержки из исходного кода по определению этих макросов.
#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \ IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL) #define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \ AFX_DATADEF CRuntimeClass class_name::class##class_name = { \ #class_name, sizeof(class class_name), wSchema, pfnNew, \ RUNTIME_CLASS(base_class_name), NULL }; \ CRuntimeClass* class_name::GetRuntimeClass() const \ { return RUNTIME_CLASS(class_name); } \
Если не эти макросы, то Вам пришлось бы все это писать. Можете и сами писать. Но лучше уж макроопредления. Может с их реализацией мы подробнее когда-нибудь разберемся.
Давайте организуем поддержку информации о классе во время выполнения программы для нашего класса.
#include "stdafx.h" #include "afxwin.h" #include "iostream.h" class CMyObject : public CObject { protected: DECLARE_DYNAMIC(CMyObject) }; IMPLEMENT_DYNAMIC(CMyObject,CObject); void main() { CMyObject* myObj = new CMyObject; }