Question

Selon cette , void* n'a pas d'informations RTTI donc coulée de void* est pas légal et de sens.

Si je me souviens bien, dynamic_cast de void* travaillait sur gcc.

Pouvez-vous s'il vous plaît clarifier la question.

Était-ce utile?

La solution

dynamic_cast ne fonctionne que sur des types polymorphes, à savoir les classes contenant des fonctions virtuelles.

Dans gcc vous pouvez dynamic_cast void* mais pas :

struct S
{
    virtual ~S() {}
};

int main()
{
    S* p = new S();
    void* v = dynamic_cast<void*>(p);
    S* p1 = dynamic_cast<S*>(v); // gives an error
}

Autres conseils

En 5.2.7 - Dynamic cast [expr.dynamic.cast] il est dit que pour dynamic_cast<T>(v):

  • Si T est un type de pointeur, v doit être un rvalue d'un pointeur vers le type de classe complète
  • Si T est un type de référence, v doit être une lvalue d'un type de classe complète (merci USTA pour commenter mon manque ce)

...

  • Dans le cas contraire, v est un pointeur ou une lvalue d'un type polymorphes

Alors, non, un (void*) valeur est pas autorisé.

Think Let à ce que votre demande pourrait vouloir dire: dites que vous avez un pointeur qui est vraiment un Derived1*, mais le code dynamic_cast-ing ne sait que c'est un void*. Disons que vous essayez de le jeter à un Derived2*, où les deux classes dérivées ont une base commune. À première vue, vous pourriez penser que tous les pointeurs se pointent vers le même objet Base, qui contiendrait un pointeur vers la table d'expédition virtuelle pertinente et RTTI, donc tout pourrait accrocher ensemble. Mais, considérer que les classes dérivées peuvent avoir plusieurs classes de base, et donc le sous-objet de classe Base nécessaires pourraient ne pas être celui auquel la Derived* - disponible uniquement en tant que void* - pointe. Il ne fonctionnerait pas. Conclusion: les besoins du compilateur de connaître ces types de sorte qu'il peut effectuer certains ajustements aux pointeurs en fonction des types impliqués

.
Derived1* -----> [AnotherBase]
                 [[VDT]Base]    <-- but, need a pointer to start of
                 [extra members]    this sub-object for dynamic_cast

(Certaines réponses parlent de la nécessité pour le pointeur que vous castez de être d'un type polymorphes, ayant des fonctions virtuelles. C'est tout valide, mais un peu trompeur. Comme vous pouvez le voir ci-dessus, même si le void* est un tel type, il ne serait toujours pas fiable fonctionner sans les informations de type complet, que le vrai problème est que void* pointe vraisemblablement au début de l'objet dérivé, alors que vous avez besoin d'un pointeur vers la classe de base sous-objet à partir de laquelle la distribution dérive de type -à.)

Il est vrai que void* ne peut pas être dynamically_casted de.

Vous êtes probablement mal remémoration. Avec g ++ 4.5 et le code suivant

struct A {
    virtual ~A();
};

int main() {
    A a;
    void *p = &a;
    A* pa = dynamic_cast<A*>(p);
}

je reçois l'erreur suivante:

  

ne peut pas dynamic_cast 'p' (de type 'void *') pour taper 'struct A *' (source est pas un pointeur de classe)

Je suppose que vous confondez avec dynamic_cast void*. Ce qui est légal et obtient le pointeur sur l'objet de classe la plus dérivée.

dynamic_cast de void* est illégal - le type de produit doit être coulé polymorphes. - contenir au moins une fonction virtuelle (destructor virtuelle chiffres aussi)

Vous pouvez jeter un pointeur type polymorphes à void *, mais pas vice versa.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top