Я два класса Base
и Derived
как это:Странное поведение информации о типе времени выполнения
class Base
{
public:
};
class Derived : public Base
{
public:
};
и основные функции:
int main()
{
Base* ptr = new Derived;
std::cout << typeid(*ptr).name() << endl;
delete ptr;
system("pause");
}
выходов Программа показывает class Base
, где я ожидал, что он будет показывать class Derived
. Но когда я добавил виртуальный метод в класс Base
, теперь выходы показывают class Derived
!
Для чего RTTI нужен хотя бы один виртуальный метод?
Похоже, что дубликат [Typeid не работает корректно] (http://stackoverflow.com/q/18147864/1708801), в основном, если вы добавляете виртуальные методы, вы получите желаемый результат. –
Если вы пишете компилятор, как бы вы реализовали 'typeid'? Я бы, вероятно, сделал это как скрытый виртуальный метод. Но если класс не имеет виртуальных методов (и, следовательно, нет vtable), это невозможно. Я думаю, что спецификация C++ была написана для этого. –
Вы указали 'ptr' как' Base * '. Что еще вы ожидаете? Это не похоже на Java, у которого есть проверка типа времени выполнения. C++ полностью статичен. – texasbruce