Могут ли дочерние шаблоны, хранящиеся в массиве базовых классов, использовать перегруженную виртуальную функцию? - PullRequest
1 голос
/ 23 октября 2010

В надежде упростить домашнюю задачу, связанную с наследованием, я подумал, что для решения этой задачи лучше использовать полиморфизм Это не обязательно, но имеет больше смысла, если это возможно. Однако я получаю символьные ошибки, заставляющие его работать так, как я думал, или просто вызывается определение базового класса. Я хочу, чтобы была вызвана перегруженная функция, основанная на объекте.

template <class T>
class Fruit {
  private:
    int count;
    T type;
  public:
    virtual void Info();
};

template <class T>
class Apple : public Fruit<T> {
  private:
    int variety;
  public:
    void Info();
};

// more fruit-child classes

vector<Fruit<int> > fruits; // contains object of various derived types

...

for(int i=0; i<fruits.size(); i++
    fruits[i].Info();

1 Ответ

1 голос
/ 23 октября 2010

Я собираюсь оставить вещи типа в стороне, хотя я думаю, что вам, вероятно, это не нужно и, следовательно, шаблон не нужен ... но вот что вам нужно:

Во-первых, вектор должен содержать указатели:

vector<Fruit<int> *> fruits;

это предотвращает нарезку (где отрезана часть объекта Apple).

Кроме того, теперь, когда у вас есть указатели, ваш цикл изменится:

for(int i=0; i<fruits.size(); i++)
    fruits[i]->Info();

Теперь будет вызываться соответствующая функция Info для типа вашего фрукта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...