Я видел, что многие люди используют new
создавать экземпляры производных классов, а затем они сохраняют указатель на базу в некотором контейнере. Имеет ли это какое-либо преимущество в отношении использования контейнера для каждого производного класса?
Под этим я подразумевал что-то вроде следующего
class A
{
public:
vector<Base*> bases;
set<Derived1> der1;
set<Derived2> der2;
//other stuff
};
Редактировать: убрал вторую часть вопроса и добавил как комментарий.
Если вы делаете следующее
vector<base*> bases;
Затем вы можете использовать полиморфизм на ваших объектах.
Представьте, что у вас есть базовый класс по имени ГИБУЛЕ. У него есть метод move () для перехода из точки А в точку Б.
class Vehicule
{
public:
virtual void move(){}
}
Тогда у вас есть два производных класса: автомобиль и подводная лодка
class Car : public Vehicule
{
public:
void move()
{
checktires();
drive();
}
}
И ваш подкласс
class Submarine : public Vehicule
{
public:
void move()
{
submersion();
propulsion();
}
}
Поскольку метод перемещения является виртуальным, вы будете выполнять полиморфизм. Это механизм, который позволяет вам вызывать одну и ту же функцию, но с разным поведением, основанным на динамическом типе ваших объектов.
Я постараюсь объяснить это предложение как можно лучше.
Теперь, когда у вас есть классы GTULE, Car и Submarine, вы создадите массив (или STL-контейнеры, такие как вектор) указателей GTULE.
std::vector<Vehicule*> objects;
objects.push_back(new Car());
objects.push_back(new Submarine());
objects[0]->move();
objects[1]->move();
Первый вызов move будет вызывать метод move, определенный в методе Car. А второй назовет ход, определенный на подводной лодке. Потому что у вас может быть вектор из GTule *, но когда вы вызываете функцию и она является виртуальной, вы вызываете соответствующую версию. И, вызывая только одну функцию, вы ведете себя по-разному.
Вы можете добавить как можно больше производных классов из GTule, вам просто нужно адаптировать метод перемещения.
Вы должны искать в стеке поток полиморфизм, есть гораздо более подробные и точные ответы, которые я только что написал.
Извините за ошибки, я не являюсь носителем английского языка.
Других решений пока нет …