Пример поиска информации о типе времени выполнения без RTTI
MFC использует функцию IsKindOf () для получения информации о типе времени выполнения.Метод, используемый MFC для поиска информации о типе, похож на пример, приведенный ниже.
#define RUNTIME_CLASS(class_name) (class_name::GetThisClass())
#define RUNTIME_OBJ(class_name) (class##class_name)
struct RunTimeClass
{
string name;
};
class base
{
static RunTimeClass RUNTIME_OBJ(base); //watch the naming
public:
bool IsExactKind(RunTimeClass* pRTclass)
{
if(pRTclass == GetRunTimeClass())
{
return true;
}
return false;
}
static RunTimeClass* GetThisClass()
{
return &RUNTIME_OBJ(base);
}
virtual RunTimeClass* GetRunTimeClass()
{
return &RUNTIME_OBJ(base);
}
virtual ~base() = 0;
};
class derived: public base
{
static RunTimeClass RUNTIME_OBJ(derived); //watch the naming
public:
RunTimeClass* GetRunTimeClass()
{
return &RUNTIME_OBJ(derived);
}
static RunTimeClass* GetThisClass()
{
return &RUNTIME_OBJ(derived);
}
};
class derived2: public derived
{
static RunTimeClass RUNTIME_OBJ(derived2); //watch the naming
public:
RunTimeClass* GetRunTimeClass()
{
return &RUNTIME_OBJ(derived2);
}
static RunTimeClass* GetThisClass()
{
return &RUNTIME_OBJ(derived2);
}
};
В файле cpp
RunTimeClass base::classbase = {"base"}; //not using the macro RUNTIME_OBJ
RunTimeClass derived::classderived = {"derived"}; //not using the macro RUNTIME_OBJ
RunTimeClass derived2::classderived2 = {"derived2"}; //not using the macro RUNTIME_OBJ
base::~base() {}
void main()
{
derived *ptrDer = new derived();
bool isder = ptrDer->IsExactKind(RUNTIME_CLASS(derived));
derived2 *ptrDer2 = new derived2();
isder = ptrDer2->IsExactKind(RUNTIME_CLASS(derived2));
delete ptrDer;
delete ptrDer2;
}
Обратите внимание, что это можно найти только в том случае, если объект имеет точныйтип класса.Чтобы добавить информацию о типе, вам просто нужно наследовать от базы и добавить переменную Runtimeclass и реализовать две функции getthisclass (), getruntimeclass ().MFC использует CObject в качестве базового класса, который обеспечивает аналогичную функциональность.Кроме того, есть больше макросов, чтобы сделать вашу жизнь проще.Функция IsKindOF () в MFC обходит всю иерархию и обнаруживает, что объект «является» типом класса (которого нет в моей уменьшенной версии).Вы можете видеть, что это немного похоже на RTTI, поэтому я думаю, что нет разницы в производительности.Он есть в MFC, потому что он был там до RTTI.
Итак, если есть функция IsA (), которая работает лучше, чем RTTI, я бы хотел увидеть реализацию.