Если я делаю приведение из базового типа в производный, но базовый тип не является экземпляром производного типа, но только использует результат, если он есть, я получаю неопределенное поведение?
Трудно понять, что я спрашиваю? взгляните на этот пример:
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, и, вероятно, это не отличный код, но меня больше интересует, действительно ли это)