Если у меня есть следующие классы:
class Object { ... }
class MyClass1: public Object { ... }
class MyClass2: public Object { ... }
и стек: std::stack<Object> statesObjects;
MyClass1 c1;
MyClass2 c2;
statesObjects.push(c1); // okay
statesObjects.push(c2); // okay
Как я могу вытащить их и извлечь элемент во главе стека (с top()
) без dynamic_cast
, так как я не работаю с указателями здесь?
Короткий ответ заключается в том, что с вашим стеком как есть вы не можете выдвигать элементы как элементы типа производного класса. Положив их в стек, у вас есть нарезанный их к элементу класса стека. То есть только эта часть базового класса была скопирована в стек.
Тем не менее, вы можете иметь набор указателей, а затем вы можете использовать dynamic_cast
при условии, что статически известный класс имеет хотя бы один virtual
функция-член или, как говорит стандарт, при условии, что статически известный класс полиморфный.
На третьей и захватывающей руке, однако, вместо Java-подобного уныния использовать виртуальную функцию в общем базовом классе. Часто это работает, чтобы просто иметь такую функцию. Для более сложных сценариев вам, возможно, придется использовать шаблон посетителя (Google), но в основном идея заключается в том, что виртуальные функции являются «безопасным» поддерживаемым языком типом безопасного способа достижения эффекта даункастов.
Вы не можете выдвинуть их в их исходные классы, когда вы назначаете подкласс экземпляру суперкласса, он получает нарезанный в экземпляр суперкласса. т.е. копии c1
а также c2
которые находятся в stack
сейчас случаи Object
а не их оригинальные классы
Похожий на Как сделать так, чтобы метод child вызывался: виртуальное ключевое слово не работает?
Даже если вы хотите сохранить в своем классе производный объект класса, то сохранится только часть базового класса объекта. Короче Вы получаете Нарезка объектов.
Подводя итог, вы не можете хранить объекты производного класса в этом контейнере. Вам нужно будет сохранить указатель на Base как тип conainter и использовать динамический полиморфизм для достижения этой цели.
Хорошо для чтения:
Что такое нарезка объектов?