Если бы мне пришлось создать базовый класс с именем base
и производные классы с именами derived_1
, derived_2
и т. д. Я использую коллекцию экземпляров базового класса, то, когда я извлекаю элемент и пытаюсь его использовать, я бы обнаружил, что С++ считает, что это type относится к базовому классу, вероятно, потому, что я получил его из std::vector
base. Это проблема, когда я хочу использовать функции, которые существуют только для конкретного производного класса, тип которого, как я знал, был этим объектом, когда я помещал его в вектор.
Поэтому я привел элемент к тому типу, которым он должен быть, и обнаружил, что это не сработает.
(derived_3)obj_to_be_fixed;
И вспомнил, что это указатель. После некоторой настройки это теперь сработало.
*((derived_3*)&obj_to_be_fixed);
Это правильно или есть, например, функция abc_cast()
, которая делает это с меньшим беспорядком?
редактировать:
Мне пришлось расширить это до другого вопроса, там показаны полные решения. stackoverflow.com ... почему-the-polymorphic-types-error- и-уборка-вопрос
std::vector< base >
илиstd::vector< base * >
? Потому что в первом случае, если вы храните объекты производного класса, вероятно, также происходит некоторая нарезка объектов... - person Matteo Italia   schedule 08.01.2011std::vector< base *>
; это сохранит объекты нетронутыми, хотя вы все равно получите их как указатели на базовый класс (см. Ответ @Peon the Great, чтобы узнать, как с ними бороться). - person Matteo Italia   schedule 08.01.2011(derived_3&)obj_to_be_fixed
может показаться, что он работает, но это не так! - person Oliver Charlesworth   schedule 08.01.2011