Есть ли причина, по которой std::type_info
задан как полиморфный? Деструктор указан как виртуальный (и есть комментарий к эффекту "так, чтобы он был полиморфным" в "Проекте и эволюции С++" ). Почему я не вижу убедительной причины. У меня нет какого-либо конкретного варианта использования, мне просто интересно, есть ли когда-нибудь обоснование или история.
Вот некоторые идеи, которые я придумал и отклонил:
- Это точка расширяемости. Реализации могут определять подклассы, а затем программы могут пытаться
dynamic_cast
astd::type_info
на другой производный тип, определенный реализацией. Возможно, это причина, но, похоже, для реализаций так же просто добавить элемент, определенный реализацией, который может быть виртуальным. Программы, желающие протестировать эти расширения, в любом случае обязательно не переносятся. - Чтобы гарантировать, что производные типы будут уничтожены должным образом, когда
delete
с базовым указателем. Но нет стандартных производных типов, пользователи не могут определять полезные производные типы, потому чтоtype_info
не имеет стандартных публичных конструкторов, поэтомуdelete
указательtype_info
никогда не является законным и переносимым. И производные типы не полезны, потому что они не могут быть построены - единственное, что я знаю для таких неконструктивных производных типов, - это реализация таких вещей, как черта типаis_polymorphic
. - Открывает возможность метаклассов с настраиваемыми типами - каждый реальный полиморфный
class A
получит производный "метакласс"A__type_info
, который происходит отtype_info
. Возможно, такие производные классы могут выставлять членов, которые вызываютnew A
с различными аргументами конструктора безопасным типом, и тому подобное. Но создание самого полиморфизмаtype_info
фактически делает такую идею практически невозможной для реализации, потому что вам придется иметь метаклассы для ваших метаклассов, бесконечность, что является проблемой, если все объектыtype_info
имеют статическую память. Возможно, запрет на это является причиной его полиморфности. - В некоторых случаях использование RTTI-функций (отличных от
dynamic_cast
) до самогоstd::type_info
, или кто-то думал, что это было мило или неловко, еслиtype_info
не был полиморфным. Но, учитывая, что нет стандартного производного типа и других классов стандартной иерархии, на которые можно было бы разумно попробовать перебросить, возникает вопрос: что? Существует ли использование выражений типаtypeid(std::type_info) == typeid(typeid(A))
? - Это потому, что разработчики создадут свой собственный производный тип (как я считаю, GCC делает). Но зачем это спрашивать? Даже если деструктор не был указан как виртуальный, и разработчик решил, что это должно быть, конечно, что реализация может объявить его виртуальной, поскольку она не изменяет набор разрешенных операций на
type_info
, поэтому переносная программа не будет быть в состоянии сказать разницу. - Это как-то связано с компиляторами с частично совместимыми ABI, сосуществующими, возможно, в результате динамической компоновки. Возможно, разработчики могли распознать свой собственный подкласс
type_info
(в отличие от одного источника от другого поставщика) портативным способом, еслиtype_info
гарантированно будет виртуальным.
Последний из них наиболее правдоподобен для меня на данный момент, но он довольно слаб.