Полиморфизм иерархий виртуальных классов работает только через ссылки или указатели на базовый подобъект:
struct Der : Base { /* ... */ };
Der x;
Base & a = x;
a.foo(); // calls Der::foo() from x
Функция foo
отправляется полиморфно, если онаэто виртуальная функция в Base
;полиморфизм относится к тому факту, что хотя вы вызываете функцию-член объекта типа Base
, фактически вызываемая функция может быть реализована в классе Der
.
Контейнеры могут хранить только элементыфиксированного типа.Чтобы хранить полиморфную коллекцию, вместо этого вы можете иметь контейнер указателей на базовый класс.Поскольку вам необходимо хранить фактические объекты в другом месте, управление временем жизни нетривиально, и лучше всего оставить его в специальной оболочке, такой как unique_ptr
:
#include <list>
#include <memory>
int main()
{
std::list<std::unique_ptr<Base>> mylist;
mylist.emplace_back(new Der1);
mylist.emplace_back(new Der2);
// ...
for (p : mylist) { p->foo(); /* dispatched dynamically */ }
}