

Программирование на языке 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
}
Похожие статьи: Метод CRuntimeClass
