Полиморфные шаблонные классы с параметрами полиморфного шаблона

В упрощенном дизайне класс 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 подклассов базового, полиморфного класса.

2

Решение

Сначала скажите мне, когда мы перейдем к «упрощенной» части.

Отогните всю половину шаблонов, чтобы сконцентрироваться на части, которую вы пытаетесь превратить в полиморф). В конце концов у вас есть различные классы Base<A> а также Base<B>, (последний путем образования Derived<B>).

Ни один из этих унаследовать от их соответствующих параметров шаблона. Поэтому отношения (иерархические или иные) A в B не имеет значения. Base<A> а также Base<B> различны и не связаны, и поэтому то, что вы пытаетесь сделать как написано, не может работать. На самом деле, даже если сделал наследовать от A а также B соответственно, самое лучшее, на что вы могли надеяться, это A* указатель, который вы не используете в своем примере.

И я с удовольствием удалите это, если показано иначе, потому что мне действительно любопытно.

4

Другие решения

Мешок с яблоком Base<B> это не мешок с фруктами Base<A> потому что вы можете положить персик, вишню и грушу в сумку с фруктами.

3

Это не может работать для указателей. Результат new Derived<B> не может быть назначен Base<A>*на самом деле это не может быть даже назначено Derived<A>* поскольку все эти типы не связаны. Вам действительно нужны эти отношения между шаблонными обертками? Разве этого недостаточно, чтобы гарантировать конвертируемость значений Base<B> а также Base<A> (как это делают стандартные умные указатели)? У вас уже есть это с шаблонным конструктором преобразования …

//...
Base<B> tB(new B);
Base<A> tA = tB;
//...
1
По вопросам рекламы [email protected]