Экземпляр для объектов в c ++ (не указатели)

Если у меня есть следующие классы:

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 , так как я не работаю с указателями здесь?

6

Решение

Короткий ответ заключается в том, что с вашим стеком как есть вы не можете выдвигать элементы как элементы типа производного класса. Положив их в стек, у вас есть нарезанный их к элементу класса стека. То есть только эта часть базового класса была скопирована в стек.

Тем не менее, вы можете иметь набор указателей, а затем вы можете использовать dynamic_cast при условии, что статически известный класс имеет хотя бы один virtual функция-член или, как говорит стандарт, при условии, что статически известный класс полиморфный.

На третьей и захватывающей руке, однако, вместо Java-подобного уныния использовать виртуальную функцию в общем базовом классе. Часто это работает, чтобы просто иметь такую ​​функцию. Для более сложных сценариев вам, возможно, придется использовать шаблон посетителя (Google), но в основном идея заключается в том, что виртуальные функции являются «безопасным» поддерживаемым языком типом безопасного способа достижения эффекта даункастов.

8

Другие решения

Вы не можете выдвинуть их в их исходные классы, когда вы назначаете подкласс экземпляру суперкласса, он получает нарезанный в экземпляр суперкласса. т.е. копии c1 а также c2 которые находятся в stack сейчас случаи Object а не их оригинальные классы

Похожий на Как сделать так, чтобы метод child вызывался: виртуальное ключевое слово не работает?

2

Даже если вы хотите сохранить в своем классе производный объект класса, то сохранится только часть базового класса объекта. Короче Вы получаете Нарезка объектов.

Подводя итог, вы не можете хранить объекты производного класса в этом контейнере. Вам нужно будет сохранить указатель на Base как тип conainter и использовать динамический полиморфизм для достижения этой цели.

Хорошо для чтения:
Что такое нарезка объектов?

2
По вопросам рекламы [email protected]