#c #inheritance #polymorphism
Вопрос:
Я пытаюсь создать своего рода двойную полиморфную карту в C .
У меня есть что-то вроде этого:
class Base{ }; class Derived : Base{ }; template lt;typename Tgt; class ClassTemplate{ std::vectorlt;Tgt; vec; }; class TemplatedBase : ClassTemplatelt;Basegt;{ }; class TemplatedDerived : ClassTemplatelt;Derivedgt;{ };
Я хочу создать функцию, которая принимает a std::maplt;std::string, ClassTemplatelt;Basegt;gt;
(или указатели значений) и сможет использовать полиморфизм для передачи объектов типа std::maplt;std::string, TemplatedDerivedgt;
.
В настоящее время я могу добиться чего-то частично правильного, сделав аргумент a std::maplt;std::string, ClassTemplatelt;Derivedgt;*gt;
и создав его из a std::maplt;std::string, TemplatedDerivedgt;
. Однако это не сработает, если бы я хотел заставить его работать std::maplt;std::string, ClassTemplatelt;Basegt;*gt;
.
Я получаю ошибку: недопустимая инициализация ссылки типа » std::картаlt;std::строка, шаблон, архивированныйamp;» из выражения типа » std::картаlt;std::строка, табличка класса*gt;».
Есть ли способ заставить это работать для универсальной функции для карт с ClassTemplatelt;Basegt;
помощью ?
Комментарии:
1. Нет, к сожалению, C так не работает. Не имеет значения, какие классы
A
иB
являются ли они классами или экземплярами шаблонов, ноstd::maplt;std::string, Agt;
не являются суперклассомstd::maplt;std::string, Bgt;
, независимо от того, какA
иB
связаны друг с другом, является ли один из них подклассом A или B или нет. Это фундаментально для C .