Код (Text): #include <iostream> struct base { }; struct derived : public base { }; int main() { base* ptr = new derived; std::cout << typeid(*ptr) << std::endl; return 0; } Если у base нет виртуальных функций, то typeid не понимает что за ptr скрывается derived. Это можно обойти?
_DEN_ Так ведь и в процессе выполнения нельзя определить derived, объект будет base: Код (Text): #include <iostream> using std::cout; using std::endl; struct base { /*virtual*/ void f() { cout << __FUNCTION__ << endl; } // virtual ~base(){} }; struct derived: public base { void f() { cout << __FUNCTION__ << endl; } // virtual ~derived(){} }; int main() { base* ptr = new derived; std::cout << typeid(*ptr).name() << endl; ptr->f(); return 0; }
IceStudent Кхм... Ты пример-то запускал? Если есть vtbl то по референсу typeid определяет кто скрывается за базовым типом.
_DEN_ Вряд ли... в VC++ доступ к RTTI полиморфного класса реализован через vftable, а для неполиморфного жёстко кодируется при компиляции. Не поможет даже реализация своей версии RTTI-ф-ций CRT. А зачем обходить-то?
_DEN_ Ну так делай все классы, для которых нужна "динамическая" RTTI, полиморфными, порождая их от специально заведённого базового. С динамической RTTI неизбежно связаны накладные расходы на каждый экземпляр класса, поэтому должна быть возможность добавлять её только для определённых классов. Можно было, конечно, ввести в язык специальный квалификатор, особого выигрыша это не даст, поскольку при наличии vftable добавочные RTTI-расходы на объект равны нулю. --- хз
green Умнег, блин))) А если это не мои классы? Хм... Да, я тут подумал - на этапе компиляции не узнать, каким классам понадобится динамический RTTI. Придется полюбэ это как-то явно указывать. Видимо Саттер и Компания решили, что наиболее подходящее указание - это наличие виртуальных функций.
_DEN_ Запускал. Вывело, как и должно было быть: "struct base\nbase::f\n". У меня ж virtual закомментировано. Иначе определяет правильно.
IceStudent Значит я тебя не правильно понял. Но это значит что и ты не понял вопроса)) О статическом TI речь и не шла. Понятное дело что речь идет о рантайме.
_DEN_ Ты имеешь в виду чужие классы в бинарном(скомпилированном) виде ? Тогда вообще труба, по-моему - там даже "статической" RTTI может не быть.