Иерархия классов, такая как та, которую вы представляете, не является polymorphi c из коробки.
И dynamic_cast
требует, чтобы иерархия была полиморфной c.
Самый простой способ сделать полиморфизм иерархии c - это создать деструктор базового класса virtual
:
class Shape {
public:
virtual ~Shape() = default;
};
Это также имеет преимущество, заключающееся в том, что теперь вы можете безопасно вызвать delete
для указателя на Shape*
, где тип Dynami c является одним из дочерних классов.
Обоснование этого состоит в том, что полиморфизм приводит к затратам времени выполнения, которые могут не потребоваться . Это также означает, что ваши классы теряют некоторые из своих C -подобных свойств, таких как тривиальные типы.
Обратите внимание, что после того, как вы представили этот виртуальный деструктор, значение c
в
Circle* c = dynamic_cast<Circle*>(s);
будет nullptr
, а поведение c->SetRadius(3.0);
не определено.