Программирование на языке MFC

Мой второй блог в серии программирования

Метод CRuntimeClass::lsDerivedFrom


После того как мы выбрали информацию времени исполнения класса из элемента массива с указанным индексом, нам необходи­мо определить, какую схему класса необходимо возвращать в ме­тод ReadObject(). Если номер схемы записан в хэш-таблице, т. е. схемы ожидаемого и загружаемого классов не совпадают, то готовимся к тому, что будем сохранять записанную в хэш-таб­лице схему, если же номер схемы в хэш-таблице не найден, т. е. схемы ожидаемого и загружаемого классов совпадают, то го­товим к возвращению схему, находящуюся в информации времени исполнения класса.

Еще одна проверка – а вдруг класс, который мы считали из ар­хива, не является наследником класса, информация о котором пе­редана методу ReadClass() в качестве аргумента? Проверка осу­ществляется при помощи метода CRuntimeClass::lsDerivedFrom(). Исходный код этого метода находится в файле objcore.cpp:

BOOL CRuntimeClass::IsDerivedFrom(const

CRuntimeClass* pBaseClass) const

{

ASSERT(this !=NULL);

ASSERT(AfxIsValidAddress(this,

sizeof(CRuntimeClass), FALSE)); ASSERT(pBaseClass !=NULL); ASSERT(AfxIsValidAddress(pBaseClass,

sizeof(CRuntimeClass), FALSE));

// simple SI case

const CRuntimeClass* pClassThis = this;

while (pClassThis != NULL)

{

if (pClassThis == pBaseClass) return TRUE; #ifdef _AFXDLL

pClassThis = (*pClassThis->m_pfnGetBaseClass) (); #else

pClassThis = pClassThis->m_pBaseClass; #endif }

return FALSE; // walked to the top, no match

}

Похожие статьи: