Voici mon exemple de test:comment utiliser reinterpret_cast pour lancer un pointeur de classe dérivée en C++
struct base {
virtual ~base(){}
int x;
};
struct derived: public virtual base {
base * clone() {
return new derived;
}
derived(): s("a") {}
std::string s;
};
int main() {
derived d;
base * b = d.clone();
derived * t = reinterpret_cast<derived*>(b);
std::cout << t->s << std::endl;
return 0;
}
Il tombe en panne sur la ligne où imprimer s. Puisque "b" est un pointeur vers la classe dérivée, reinterpret_cast devrait simplement fonctionner. Je me demande pourquoi il se bloque. En même temps, si je remplace reinterpret_cast par dynamic_cast, alors cela fonctionne.
N'avait pas pour l'héritage virtuel, 'static_cast' aurait travaillé. Il n'est pas nécessaire d'aller en cours d'exécution quand vous savez à coup sûr que votre base est dérivée. –
Oui, vous avez raison, si je supprime _virtual_ et le rend juste structure dérivée: base publique, puis reinterpret_cast fonctionne aussi (au moins, il n'y a pas de plantages) – Andrei
K-ballo: vous savez, les règles laides de l'héritage lors de la construction des bibliothèques (vous ne savez pas si dans le futur une classe sera héritée via deux chemins) vous forcer à abuser parfois de l'héritage virtuel juste au cas où. –