dynamic_cast de “void *”
Selon cette, void*
n'a pas de RTTI de l'information, donc de la conversion de void*
n'est pas légal et de sens.
Si je me souviens bien, dynamic_cast
de void*
travaillait sur gcc.
Pouvez-vous clarifier la question.
Vous devez vous connecter pour publier un commentaire.
dynamic_cast
ne fonctionne que sur les types polymorphes, c'est à dire les classes contenant des fonctions virtuelles.Dans gcc, vous pouvez
dynamic_cast
àvoid*
mais pas de:Dans
5.2.7 - Dynamic cast [expr.dynamic.cast]
il est dit que pourdynamic_cast<T>(v)
:T
est de type pointeur,v
est une rvalue d'un pointeur de classe complète typeT
est un type de référence,v
doit être une lvalue d'un type de classe (merci usta pour les commentaires sur mon manque)...
v
doit être un pointeur ou une lvalue d'un type polymorpheAlors, non, un
(void*)
valeur n'est pas autorisé.Pensons à ce que votre demande pourrait dire: dites que vous avez un pointeur c'est vraiment un
Derived1*
, mais le codedynamic_cast
-ing seul sait que c'est unvoid*
. Disons que vous êtes en train de jeter à unDerived2*
, où les deux classes dérivées ont une base commune. Superficiellement, on pourrait croire que tous les pointeurs pointant à la mêmeBase
objet, qui contient un pointeur vers l'virtuels pertinents expédition table et RTTI, donc tout ce qui pourrait les accrocher ensemble. Mais, considérer que les classes dérivées peuvent avoir plusieurs classes de base, et donc le besoinBase
classe de sous-objet peut ne pas être le seul à qui leDerived*
- disponible uniquement envoid*
- est de pointage. Ça ne marcherait pas. Conclusion: le compilateur a besoin de connaître ces types de sorte qu'il est possible d'effectuer quelques ajustement pour les pointeurs sur la base des types concernés.(Certaines réponses à parler de la nécessité pour le pointeur vous êtes à la coulée d'être d'un type polymorphe, ayant des fonctions virtuelles. C'est valide, mais un peu trompeur. Comme vous pouvez le voir ci-dessus, même si le
void*
est à un tel type, il ne fonctionne pas de manière fiable, sans le type complet de l'information, que le réel problème est quevoid*
est sans doute pointant vers le début de l'objet dérivé, alors vous avez besoin d'un pointeur sur la classe de base sous-objet à partir duquel la fonte de type de dérive.)Il est vrai que
void*
ne peut pas êtredynamically_cast
ed.Vous êtes probablement mal se souvenir.
Avec g++ 4.5 et le code suivant
J'obtiens l'erreur suivante:
Je pense que vous confondez avec
dynamic_cast
àvoid*
. Qui est légal et obtient le pointeur de la plupart des objet de classe dérivée.dynamic_cast
devoid*
est illégal - le type coulée de doit être polymorphe - contenir au moins une fonction virtuelle (virtual destructeur compte aussi).Vous pouvez jeter un pointeur de type polymorphe à
void *
, mais pas vice-versa.