10
votes

Conversion d'un vidien * au pointeur de la classe de base

J'ai une hiérarchie: base, classes dérivées et certaines structures stockant les données utilisateur comme vide *. Ce vide peut stocker la base et les classes dérivées. Le problème principal que je ne sais pas ce que je ne sais pas ce qui est stocké de base ou de pointeur dérivé.

xxx

Comment convertir le vide * pour obtenir le champ [Type] pour les deux pointeurs? Merci d'avance.


4 commentaires

Utilisez-vous plusieurs héritages?


Je ne sais pas pourquoi vous essayez cette conversion dans une langue orientée objet..anyway, vous devez utiliser dynamic_cast à la place.


Oui. La classe dérivée d'origine est dérivée de 4 classes. et la base a aussi le parent.


TGADFLY: Ensuite, vous avez besoin dynamic_cast


4 Réponses :


1
votes

Si vous savez que c'est un pointeur dérivé et que vous souhaitez obtenir un pointeur de base, vous pouvez le faire: XXX

Vous constaterez que la base * pointe vers un emplacement différent de celui dérivé que le dérivé. *, donc la distribution intermédiaire est requise.


1 commentaires

J'ai essayé ça marche, mais je ne sais pas quel pointe sur quel type est stocké



-2
votes

Utiliser dynamic_cast , il peut vous dire de manière dynamique si le pointeur pointe sur une base objet ou non.


1 commentaires

Ne pas venir d'un vide * Ça ne peut pas.



4
votes

Lorsque vous utilisez plusieurs héritage, l'objet résultant agit de manière interne un peu comme un composite, conceptuellement quelque chose comme ceci: xxx

Vous obtiendrez des adresses différentes pour votre instance de dérivée selon que vous jeter à la base1 ou base2. Donc, vous ne pouvez pas faire de manière fiable ce que vous voulez faire. Vous devrez conserver un pointeur sur l'un des types concernés et utiliser dynamic_cast

Alternativement, vous pouvez faire vos propres règles - disant toujours que vous stockez toujours l'adresse de votre L'instance a été lancée dans une classe de base spécifique et a toujours renvoyé à cette classe de base. C'est très sujet à une erreur, et je vous recommande vivement d'essayer de stocker un pointeur sur une classe de base commune si possible.


2 commentaires

S'il conserve un pointeur sur l'un des types impliqués, il ne peut pas simplement faire static_cast (b1) ? (En supposant qu'il conserve un pointeur sur base1 * ). Le static_cast fera des ajustements de décalage du pointeur si nécessaire. En d'autres termes, qu'est-ce que le dynamic_cast vous achète sur static_cast ?


La capacité de lancer entre les bases.



20
votes

VOID * S ne peut être reconverti que sur leur type d'origine. Lorsque vous stockez un dérivé * dans un void * , vous ne pouvez pas revenir à dérivé * , pas < Code> Base * .

Ceci est particulièrement perceptible avec plusieurs héritage, car votre objet dérivé pourrait ne pas nécessairement être à la même adresse que votre base. Si vous avez vraiment besoin de stocker des objets (et récupérer des objets) avec void * , toujours couler au type de base en premier, vous avez donc un moyen stable d'obtenir l'objet de récupérer: xxx

Si vous souhaitez ensuite revenir au type dérivé, utilisez un dynamic_cast (ou static_cast si vous " re garantie qu'il doit être du type dérivé.)


1 commentaires

Merci. C'était la réponse greaaaaaat. Il a résolu mon problème et expliqué -> NOID * et VOID * -> conversions. C'est une bonne idée de stocker dans le vide * non dérivé mais pré-converti au pointeur de base.