2013-06-26 4 views
1

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

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

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

+0

Что вы собираетесь делать, если кто-то добавляет новый производный тип? – PlasmaHH

+0

добавление нового набора в класс A? в любом случае, вся функциональность должна исходить от базы, поэтому проблем не должно быть. Или ты имел в виду гетконтейнер? – German

+0

Убедитесь, что вы понимаете разницу между временем компиляции и временем выполнения. –

ответ

0

Если вы выполните следующие действия

vector<base*> bases; 

Вы можете использовать полиморфизм на ваших объектах. Представьте, что у вас есть базовый класс с именем motorule. Он имеет метод перемещения(), чтобы перейти из точки А в точку Б.

class Vehicule 
{ 
    public: 
    virtual void move(){} 
} 

Тогда у вас есть два производных класса: автомобиль и подводная лодка

class Car : public Vehicule 
{ 
    public: 
    void move() 
    { 
     checktires(); 
     drive(); 
    } 
} 

И ваш класс Sub

class Submarine : public Vehicule 
{ 
    public: 
    void move() 
    { 
     submersion(); 
     propulsion(); 
    } 
} 

Поскольку метод перемещения является виртуальным, вы будете выполнять полиморфизм. Это механизм, который позволяет вам вызывать одну и ту же функцию, но иметь разные типы поведения, основанные на динамическом типе ваших объектов.

Я постараюсь объяснить это предложение как можно лучше. Теперь, когда у вас есть классы carule, Car и Submarine, вы создадите массив (или stl-контейнеры, такие как вектор) указателей транспортных средств.

std::vector<Vehicule*> objects; 
objects.push_back(new Car()); 
objects.push_back(new Submarine()); 
objects[0]->move(); 
objects[1]->move(); 

Первый вызов для перемещения вызовет метод перемещения, определенный в методе Car. А второй вызовет движение, определенное в Submarine. Поскольку у вас может быть вектор vehicleule *, но когда вы вызываете функцию и потому что она виртуальна, вы вызываете соответствующую ее версию. И, вызывая только одну функцию, у вас разные поведения. Вы можете добавить столько производного класса, что вам нужно адаптировать метод перемещения.

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

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

+0

, что я имел в виду с этим вопросом, - это больше о том, зачем использовать «новый автомобиль» и «новую подводную лодку» для каждого из них, вместо того, чтобы хранить все автомобили и подводные лодки в некоторых контейнерах. Я собираюсь создать миллионы экземпляров производных классов, поэтому мне неудобно звонить столько раз «новый», а не создавать только один набор. – German

+0

Таким образом, вы работаете над указателями. У вас может быть объект 'std :: vector ,' если вам будет комфортно с ним. Полиморфизм работает как для указателей, так и для ссылок. И вместо того, чтобы иметь несколько контейнеров с различными производными классами (что, если у вас есть 300 производных классов?) И итерации на них, вы можете иметь уникальный контейнер. –

+1

Вы беспокоитесь о фрагментации памяти? Вы хотите каким-то образом выделить много «автомобилей» в одном блоке памяти? Не. Доверяйте свой распределитель памяти библиотеки C++. Если это окажется узким местом в вашем коде, вы всегда можете предоставить какой-то фантастический пользовательский распределитель. Но на самом деле этого не будет. Напишите свой код самым чистым способом. – Peter