Как хранить объекты с различными классами (но одной и той же базы) в одной переменной

0

Я очень новичок в C++ и пытаюсь найти хороший образец для того, чтобы иметь следующее:

  • Базовый класс, который определяет несколько (виртуальных?) Функций и свойств.
  • Несколько различных классов, которые наследуют этот базовый класс и переопределяют некоторые или все виртуальные функции и работают с родительскими свойствами.
  • Тогда мой план состоял в том, чтобы иметь одну переменную, которая может хранить любой из классов и функций вызова, определенных в базовом. Иногда я заменяю объект в этой переменной для одного из других.

Это кажется разумным и как я могу хранить объекты, подобные этим из разных классов? Я надеялся просто определить переменную как BaseClass myCurrentObject; а затем сделайте что-то вроде myCurrentObject = ChildClassA(); или myCurrentObject = ChildClassB(); и т.д., но, похоже, это не так просто!

  • 0
    Это будет работать нормально, если вы будете использовать указатели вместо значений - например, BaseClass *myCurrentObject = new ChildClassA; или лучше std::unique_ptr<BaseClass> myCurrentObject (new ChildClassA); для большей безопасности (если у вас есть c ++ 11).
  • 0
    @AlexTelishev Пожалуйста, нет - используйте std :: shared_ptr или std :: unique_ptr (или, если у вас нет C ++ 11, эквиваленты повышения)
Теги:

1 ответ

0
Лучший ответ

То, что вы описываете, - это именно полиморфизм, так что да, это разумно.

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

BaseClass* obj = new ChildClassA();
obj->call_some_virtual_function(); 
  // ^ Will call the most derived definition of the function

Конечно, если вы пишете какую-либо серьезную программу, вы не должны использовать простые указатели здесь. Они просто делают слишком вероятным, что вы рано или поздно забудете удалить старый объект, на который указывает obj прежде чем назначать ему новый. Но так как вы сказали, что новичок в C++, и, возможно, просто захотите попробовать, вышесказанное может быть прекрасным.

Причина, почему это не может быть так просто, как просто написать BaseClass obj = ChildClassA(); что это означает, что obj является объектом типа BaseClass. Но так как ChildClassA может иметь больше членов, чем BaseClass, вы не можете хранить ChildClassA в месте, предназначенном только для объекта BaseClass. Таким образом, вы должны понимать, что для полиморфизма требуется переменный объем памяти, и вы можете попасть только в кучу.

  • 0
    Спасибо! Так что пока я delete obj; прежде чем указывать на новый объект, я должен быть хорошим, верно?
  • 0
    Да. Или, по крайней мере, почти: Конечно, после того, как вы удалили объект, вы также должны убедиться, что вы obj на новый действительный объект, прежде чем использовать его снова. Так что, как правило, кроме как в начале и в конце программы, вы всегда должны delete obj; obj = new Whatever() как пара, а не только один.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню