Вы можете преобразовать экземпляр дочернего класса в базовый класс, но вы не можете (ну ... должен не) преобразовать экземпляр базового класса в дочерний класс.
Редактировать:
Если вы не понимаете, как работает кастинг:
Объект никогда не меняется во время каста - на самом деле объект на самом деле просто смежныйблок памяти.Когда объект преобразуется, изменяется только то, как программа видит , а работает с объектом.
Вот почему приведение экземпляра базового объекта к дочернему объекту приводит к неопределенному поведению;среда выполнения интерпретирует базовый объект как дочерний объект и использует указатель для объекта в качестве отправной точки для ссылки на данные объекта.Если поле, определенное в дочернем классе, используется для базового объекта, приведенного в качестве дочернего объекта, программа будет ссылаться на память, которая не является частью экземпляра.Если эта ссылочная память не используется остальной частью программы, все может показаться просто (на некоторое время), но если память используется другим объектом, в вашей программе могут произойти странные вещи - другой объект можетизменить значение, которое не должно иметь, или хуже.И это только когда имеешь дело с кучей выделенных объектов;попробуйте это с указателем на объект, выделенный из стека, и вы можете полностью сорвать всю вашу программу - при условии, что вы не используете segfault.
В общем, если B наследуется от A:
- Вы можете привести экземпляр B к A
- Вы можете привести экземпляр B, который ужеприведите A назад к B, но это может указывать на небрежную архитектуру вашей программы.
- Вы не можете ( должен не) приводить экземпляр A к B, так как это приведет к неопределенному поведению.