Если я делаю приведение из базового типа в производный, но базовый тип не является экземпляром производного типа, но только использует результат, если он есть, я получаю неопределенное поведение?
Трудно понять, что я спрашиваю? взгляните на этот пример:
struct Animal { int GetType(){...} };
struct Dog : Animal { bool HasLoudBark(){...}};
struct Cat : Animal { bool HasEvilStare(){...} };
Animal * a = ...;
Dog* d = static_cast<Dog*>(a);
if(a->GetType() == DogType && d->HasLoudBark())
....
В этом случае может или не быть a
Dog
. Мы всегда делаем static_cast
of a
для Dog * d
но мы никогда не используем d
если мы не уверены в его Dog
.
Предполагая, что a
не является Dog
, это неопределенное поведение в точке броска? Или это определяется так, как мы фактически не используем d
если это действительно не Dog
?
Приветствуются ссылки на соответствующие части стандарта.
(Да, я знаю, что могу использовать dynamic_cast и RTTI, и, вероятно, это не отличный код, но меня больше интересует, действительно ли это)