Si je fais un cast d'un type de base vers un type dérivé, mais que le type de base n'est pas une instance du type dérivé, mais que j'utilise le résultat uniquement s'il l'est, est-ce que j'obtiens un comportement non défini ?
Vous avez du mal à comprendre ce que je demande ? Regardez cet exemple :
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())
....
Dans ce cas a
peut ou non être un Dog
. Nous faisons toujours le static_cast
de a
à Dog * d
mais nous n'utilisons jamais d
à moins que nous soyons sûrs que c'est un Dog
.
En supposant que a
n'est pas un Dog
Est-ce un comportement indéfini au moment de la distribution ? Ou est-il défini car nous n'utilisons pas réellement d
à moins qu'il ne s'agisse vraiment d'un Dog
?
Les références aux parties pertinentes de la norme sont appréciées.
(Oui, je sais que je peux utiliser dynamic_cast, et RTTI, et que ce n'est probablement pas un code génial, mais je suis plus intéressé de savoir si c'est valide).
3 votes
Réponse courte : elle n'est pas valable. Réponse plus longue : cela dépend de la manière dont toutes les parties manquantes sont effectivement réalisées. Veuillez poster un exemple minimal reproductible qui compile.
9 votes
Normalement, je suis tout à fait favorable à MVCE, mais je ne suis pas convaincu que cela soit vraiment utile. Je ne donne vraiment le code d'exemple que pour aider à expliquer la question - je ne me soucie pas vraiment du code inclus. En fait, c'est le contraire - je serais extrêmement intéressé par le contraire - en supposant des implémentations raisonnables de Animal, Dog, Cat, j'aimerais bien savoir ce qui ferait une différence avec la réponse comme vous le dites.
0 votes
@wally J'ai modifié ma question pour la rendre plus claire.