2013-04-03 3 views
0

Я не использовал эту функцию C++ с давних пор, поэтому просто забыл об этом. Предположим, у меня есть класс под названием «объект» и класс «кнопка», который публично выводится из «объекта».добавление объектов производного класса в вектор объектов базового класса в C++?

Теперь у меня есть вектор a или hash_map a. Смогу ли я добавлять объекты типа «кнопка: в нем или фактически любом другом классе объектов, публично производный от„объекта“Как я могу сделать это

Благодарности

ответ

1

использовать вектор указателей.?:

struct Base 
{ 
    virtual ~Base() {} 
    virtual int foo() = 0; // good manners: non-leaf classes are abstract 
}; 

struct Derived1 : Base { /* ... */ }; 
struct Derived2 : Base { /* ... */ }; 
struct Derived3 : Base { /* ... */ }; 

#include <vector> 
#include <memory> 

int main() 
{ 
    std::vector<std::unique_ptr<Base>> v; 

    v.emplace_back(new Derived3); 
    v.emplace_back(new Derived1); 
    v.emplace_back(new Derived2); 

    return v[0]->foo() + v[1]->foo() + v[2]->foo(); // all highly leak-free 
} 
+0

ли 'emplace_back' имеют какое-то преимущество над' push_back' здесь –

+0

@MattPhillips: огневая позиция для явного преобразования, которая необходима здесь Полупроницаемая лучшим решением будет включать 'make_unique', который, к сожалению, не делает. существуют. –

+0

Для явного преобразования из 'Derived *' в 'std :: unique_ptr '? Не могли бы вы объяснить, как T && 'vs' T & 'делает это различие или предоставляет ссылку? –

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