2016-02-14 3 views
1

У меня есть следующие настройки:Вызов виртуальных методов неизвестного класса детской

class Parent { 
    virtual void foo(int x) = 0; 
}; 
class Son : public Parent { 
    void foo(int x) {}; 
}; 
class Daughter : public Parent { 
    virtual void foo(int x) {}; 
}; 

Если у меня есть vector<Parent> parents, и я собираюсь, хотя вектор с петлей, как показано здесь:

for (int i = 0; i < parents.size(); i++) { 
    Parent s = parents[i]; 
    s.foo(-1); 
} 

Как я называю детей foos (они могут быть сыновьями или дочерьми)? Я получаю две ошибки в настоящее время:

  1. Variable type 'Parent' is an abstract
  2. Variable type 'Parent' is an abstract class
+0

@Barry исправил вывод, который был только опечаткой в ​​моем вопросе, а не реальным кодом. – Bren

ответ

1

Во-первых, вы должны сделать Son и Daughter быть получены классы Parent:

class Son : public Parent { 
    ... 
}; 
class Daughter : public Parent { 
    ... 
}; 

Затем, чтобы иметь вектор полиморфных объектов, вы не можете хранить в нем объекты. Вы должны взять вектор указателей на объекты для работы полиморфизма.

vector<Parent*> parents; 

или лучше:

vector<shared_ptr<Parent>> parents; 

Почему?

  • No Parent object не может быть создан, потому что это абстрактный класс. Вы можете создавать только производные классы.
  • Если Родитель не был абстрактным, ваш код мог бы работать, но, поставив Сына или Дочку в вектор, это будет sliced.
+0

Я только что забыл: public Parent part. фиксируя это сейчас. – Bren

Смежные вопросы