У меня есть базовый класс, который предоставляет чистые виртуальные интерфейсы. Мне нужно это для хранения указателей на объекты производного класса в списке указателей на базовый класс.Абстрактный базовый класс с использованием аргумента шаблона из производного класса
Производный класс создается с использованием механизма шаблона. Проблема в том, что если я хочу, чтобы виртуальный интерфейс возвращал тип, который известен только производному классу, мне нужно передать его как аргумент шаблона. Это где начинается дилемма ...
template <typename ITEM>
class base {
public:
virtual ITEM* get() = 0;
};
template <typename ITEM>
class derived : public base<ITEM>{
public:
ITEM* get() {...};
};
Но при использовании шаблона в базе мне нужно знать это, даже при создании списка базовых указателей:
base* myList[10] = {derived1, derived2,...}
я, конечно, не знаете этот тип, когда я определяю свой список. Поэтому мне нужно как-то избавиться от шаблона в моем базовом классе.
РЕДАКТИРОВАТЬ: Избавился от этого подхода, потому что это был не очень полезный подход. Поэтому нет решения для этой проблемы.
Предположим, вам каким-то образом удалось установить 'myList'. Как именно вы планируете его использовать? Вы могли бы назвать, скажем, 'myList [5] .get()' - но что бы вы сделали с результатом, когда вы не знаете, какой он тип? –
Возможно, вы можете проверить 'dynamic_cast', я не знаю, будет ли он работать с шаблоном, хотя – Ceros
Это может быть то, что у вас есть, но вы спрашиваете о ** его ** [по неправильным причинам] (http: /meta.stackexchange.com/questions/66377/what-is-the-xy-problem). – StoryTeller