Объект, на который он указывает, должен быть полиморфным, чтобы это работало так, как вы ожидаете. Если бы у A
было virtual
методов, ваш код работал бы так, как ожидалось, например, добавляя виртуальный деструктор, который я демонстрирую здесь, используя gcc< /а>.
Цитата из раздела проект стандарта C++ 5.2.8
Параграф 2 Идентификация типа гласит:
Когда typeid применяется к выражению glvalue, тип которого является типом полиморфного класса (10.3), результат ссылается на объект std::type_info, представляющий тип наиболее производного объекта (1.8) [...]
Это относится к случаю, когда у нас есть метод virtual
, в вашем случае у вас нет полиморфного типа, поэтому применяется параграф 3:
Когда typeid применяется к выражению, отличному от значения gl полиморфного типа класса, результат ссылается на объект std::type_info, представляющий статический тип выражения.
Таким образом, вы получите обратно тип static
, который равен A
.
Для полноты раздела 10.3
Виртуальные функции говорится:
Виртуальные функции поддерживают динамическое связывание и объектно-ориентированное программирование. Класс, который объявляет или наследует виртуальную функцию, называется полиморфным классом.
person
Shafik Yaghmour
schedule
09.08.2013