C ++, полиморфизм против шаблонизации аргумента функции - PullRequest
3 голосов
/ 14 января 2012

Существует два класса A и B, где A является базовым классом, а B является производным классом:

template <typename T>
class A {T a;};

template <typename T>
class B: public A <T> {T b;};

и следующий класс, представляющий модифицированный контейнер

template <typename Item>
struct TItems {typedef std::vector <Item> Type;};

template <typename Item>
class ModCont
{
    private:
            typename TItems <Item>::Type items;
};

Функция test () имеет указатель на контейнер объектов A в качестве формального параметра:

template <typename T>
void test ( ModCont <A <T> > *it) {}

Я бы хотел применить полиморфизм и передать контейнер B для теста метода:

int main(int argc, char* argv[])
{

  ModCont < A <double> > a_items;
  ModCont < B <double> > b_items;
  test (&a_items); //Works
  test (&b_items); //Does not work
  return 0;
}

Единственный способ, который я нашел, - шаблонизировать параметр метода test () следующим образом:

template <typename Object>
void test ( ModCont <Object> *it) {}

Есть ли способ, как использовать полиморфизм "функции" вместо полиморфизма компиляции (шаблоны?)

Спасибо за вашу помощь ...

Ответы [ 3 ]

3 голосов
/ 14 января 2012

Хм, во-первых, шаблоны не полиморфизм времени выполнения - это полиморфизм времени компиляции.

Если вы хотите использовать полиморфизм времени исполнения с этим, вы должны сделатьубедитесь, что ModCont<B<T> > происходит от ModCont<A<T> > - то, как C ++ обрабатывает полиморфизм, не делает его по умолчанию.В качестве альтернативы, вы можете получить все ModCont<T> из какого-то общего ModContBase, хотя неясно, как это будет работать.

3 голосов
/ 14 января 2012

яблоко - это фрукт.

Мешок с яблоками - это не мешок с фруктами. Это потому, что вы можете положить грушу в пакет с фруктами.

0 голосов
/ 14 января 2012

Вы хотите, чтобы ваш контейнер был с A *, а не с A. Вам также нужен конструктор, который принимает контейнер с U * и добавляет содержимое этого контейнера к себе. Используйте static_cast для этого приведения, чтобы обеспечить безопасность типов, т. Е. U является типом, производным от A.

...