Динамический массив объектов родительского класса для хранения дочерних объектов

У меня есть Mammal родительский класс.Dog, Cat, Lion являются подклассами.

Я использую векторы для хранения всех подклассов как Mammal объект как таковой

vector<Mammal> v;

И используя эту строку, чтобы добавить новые объекты в вектор.

v.push_back(new Dog(Name, Blue, Owner));

Видимо, это не работает. Error no instance of overload function брошен мне во время компиляции. Я новичок в C++, поэтому я не уверен, что является правильным способом динамического создания массива родительского класса для хранения всех дочерних объектов

2 ответа

Решение

Бучиппер уже дал тебе хороший совет. Если вы хотите правильно управлять временем жизни ваших питомцев, подумайте об использовании std::unique_ptr<> или же std::shared_ptr<> вместо сырых указателей:

// the vector owns the pets and kills them, when they are removed
// from the vector
vector<std::unique_ptr<Mamal> > v1

// the vector has shared ownership of the pets. It only kills them,
// when noone else needs them any more
vector<std::shared_ptr<Mamal> > v2

// the vector has no ownership of the pets. It never kills them.
vector<Mamal*> v3

В последнем случае кто-то другой должен позаботиться о смерти домашних животных, или они останутся в вашей памяти как зомби. Вы не хотите, чтобы к вашим питомцам, не так ли?

Обновление О, я забыл упомянуть, что вы должны предпочесть make_shared() а также make_unique() по новой или использовать emplace_back() вместо push_back()

v1.emplace_back(new Dog{Name, Blue, Owner});
v1.push_back(make_unique<Dog>(Name, Blue, Owner))

v2.emplace_back(new Dog{Name, Blue, Owner});
v2.push_back(make_shared<Dog>(Name, Blue, Owner))

Как уже упоминалось в комментариях, у вас есть вектор объектов Млекопитающих, а не указатели или ссылки.

Пытаться -

vector <Mammal *> v;
v.push_back(new Dog(Name, Blue, Owner));
Другие вопросы по тегам