Есть ли причина, по которой std::type_info
указан как полиморфный? Деструктор указан как виртуальный (и есть комментарий к эффекту «так, чтобы он был полиморфным» в «Проекте и эволюции C++»). Почему я не вижу убедительной причины. У меня нет какого-либо конкретного варианта использования, мне просто интересно, было ли когда-нибудь обоснование или история.Почему std :: type_info полиморфный?
Вот некоторые идеи, которые я придумал и отклоненные:
- Это точка расширяемость - реализации могут определять подклассы, а также программы, то можно попытаться
dynamic_cast
std::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
гарантированно был виртуальным.
Последнее, что наиболее правдоподобно для меня на данный момент, но оно довольно слабое.
Да, я понимаю, но я не вижу ничего портативного, что вы можете сделать с информацией о том, что это подкласс, или нет. Похоже, что все портативные, действующие программы теперь будут действительны, если они не будут полиморфными. Делать это так, чтобы вы не могли обнаруживать подклассы (делая type_info не полиморфными) не должны ничего менять для переносных программ, насколько я могу судить, и не должны создавать непереносимые расширения, которые сложнее создать. Можете ли вы придумать контрпример, что-то, что стало возможным благодаря этой спецификации? – Doug
@Doug: см. Мое редактирование –
Спасибо, но я до сих пор не понимаю, почему это последнее выражение требует, чтобы 'type_info' был полиморфным. Все полезные функции на 'type_info', такие как' operator == ',' before', 'name' и т. Д., Не указаны как виртуальные. Поэтому, если для реализации требуется виртуальная диспетчеризация этих функций, я предполагаю, что она может объявить их виртуальными или делегировать функции виртуальной реализации, а если нет, то нет необходимости делать их виртуальными. Есть что-то, что мне не хватает? – Doug