В упрощенном дизайне класс B наследует класс A полиморфно.
Шаблонный класс, Base<T>
имеет T*
член, который используется для дальнейших операций. Derived<T>
наследуется от Base<T>
полиморфно.
Какой будет синтаксис, позволяющий создавать объекты такого типа:
Base<A>* a = new Derived<B>();
Для дальнейшего использования код, который я использовал, выглядит следующим образом (конечно, преобразование не выполняется):
class A
{
public:
A()
{
cout<< " A ";
}
virtual void one()
{
cout<<" 1 ";
}
};
class B: public A
{
public:
B()
{
cout << " B ";
}
void one()
{
cout << " 2 ";
}
};
template <class T>
class Base
{
public:
T* thing;
Base()
{
cout<<"Base";
thing = new T;
}
template <class S>
Base(Base<S>* obj)
{
thing = obj->thing;
}
virtual void poly(){ thing->one();}
};
template <class T>
class Derived : public Base<T>
{
public:
Derived()
{
cout << "DERIVED ";
}
virtual void poly(){
};
int main(int argc, char** argv)
{
//Base<A>* a = (new Derived<B>());
return 0;
}
Виртуальные деструкторы и правильное управление памятью пропущены специально для краткости кода.
РЕДАКТИРОВАТЬ : единственной целью этой конструкции было бы сохранить, скажем, список BaseTemplated<BasePolymorphic>*
указатели вместе, а не использовать BaseTemplated<Derived1>
в BaseTemplated<DerivedN>
для всех N подклассов базового, полиморфного класса.
Сначала скажите мне, когда мы перейдем к «упрощенной» части.
Отогните всю половину шаблонов, чтобы сконцентрироваться на части, которую вы пытаетесь превратить в полиморф). В конце концов у вас есть различные классы Base<A>
а также Base<B>
, (последний путем образования Derived<B>
).
Ни один из этих унаследовать от их соответствующих параметров шаблона. Поэтому отношения (иерархические или иные) A
в B
не имеет значения. Base<A>
а также Base<B>
различны и не связаны, и поэтому то, что вы пытаетесь сделать как написано, не может работать. На самом деле, даже если сделал наследовать от A
а также B
соответственно, самое лучшее, на что вы могли надеяться, это A*
указатель, который вы не используете в своем примере.
И я с удовольствием удалите это, если показано иначе, потому что мне действительно любопытно.
Мешок с яблоком Base<B>
это не мешок с фруктами Base<A>
потому что вы можете положить персик, вишню и грушу в сумку с фруктами.
Это не может работать для указателей. Результат new Derived<B>
не может быть назначен Base<A>*
на самом деле это не может быть даже назначено Derived<A>*
поскольку все эти типы не связаны. Вам действительно нужны эти отношения между шаблонными обертками? Разве этого недостаточно, чтобы гарантировать конвертируемость значений Base<B>
а также Base<A>
(как это делают стандартные умные указатели)? У вас уже есть это с шаблонным конструктором преобразования …
//...
Base<B> tB(new B);
Base<A> tA = tB;
//...