Dog *d = (Dog*)aa;
Стиль приведения типа в круглых скобках называется приведением в стиле C , поскольку он предназначен для имитации поведения C. В этом случае компилятор выполняет static_cast
, чтопереходит к понижению Animal*
до Dog*
, исходя из предположения , что базовым объектом является Dog
.Поскольку базовый объект на самом деле Cat
, программа плохо сформирована, и может произойти все что угодно, включая повреждение памяти.Приведения в стиле C никогда не выполняют никаких проверок безопасности во время выполнения.
Dog* dog = dynamic_cast<Dog*>(d);
На самом деле это приведение не должно ничего делать: оно преобразуется из Dog*
в Dog*
.Проверка безопасности во время выполнения не требуется, даже если используется dynamic_cast
, поскольку предполагается, что d
является правильно сформированным Dog*
.
Совет
Избегайте бросков в стиле C.Убедитесь, что все откаты действительны.Лично я не очень много пользуюсь dynamic_cast
, но тогда я несу ответственность только за то, чтобы опускать руки должным образом.