Хранение экземпляров производного класса в C++

Я видел, что многие люди используют new создавать экземпляры производных классов, а затем они сохраняют указатель на базу в некотором контейнере. Имеет ли это какое-либо преимущество в отношении использования контейнера для каждого производного класса? Под этим я подразумевал что-то вроде следующего

class A
  {
 public:
  vector<Base*> bases;
  set<Derived1> der1;
  set<Derived2> der2;
  //other stuff
  };

Изменить: убрал вторую часть вопроса и добавил как комментарий.

1 ответ

Решение

Если вы делаете следующее

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, вам просто нужно адаптировать метод перемещения.

Вы должны искать в стеке поток полиморфизм, есть гораздо более подробные и точные ответы, которые я только что написал.

Извините за ошибки, я не являюсь носителем английского языка.

Другие вопросы по тегам