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é.
p> Comment convertir le vide * pour obtenir le champ [Type] pour les deux pointeurs?
Merci d'avance. P> p>
4 Réponses :
Si vous savez que c'est un pointeur dérivé et que vous souhaitez obtenir un pointeur de base, vous pouvez le faire: 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. P> P>
J'ai essayé ça marche, mais je ne sais pas quel pointe sur quel type est stocké
Utiliser dynamic_cast code>, il peut vous dire de manière dynamique si le pointeur pointe sur une base code> objet code> ou non. P>
Ne pas venir d'un vide * Ça ne peut pas.
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: 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 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. P> p> dynamic_cast code> p>
S'il conserve un pointeur sur l'un des types impliqués, il ne peut pas simplement faire static_cast
base1 * code>). Le
static_cast code> fera des ajustements de décalage du pointeur si nécessaire. En d'autres termes, qu'est-ce que le
dynamic_cast code> vous achète sur
static_cast code>?
La capacité de lancer entre les bases.
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 Si vous souhaitez ensuite revenir au type dérivé, utilisez un VOID * code> S ne peut être reconverti que sur leur type d'origine. Lorsque vous stockez un
dérivé * code> dans un
void * code>, vous ne pouvez pas revenir à
dérivé * code>, pas strong> < Code> Base * Code>.
void * code>, toujours em> couler au type de base en premier, vous avez donc un moyen stable d'obtenir l'objet de récupérer: p>
dynamic_cast code> (ou
static_cast code> si vous " re garantie qu'il doit être du type dérivé.) p> p>
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.
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