Ambigu de la base de l'héritage multiple
Je suis en train d'écrire certaines sous-classes des classes dans une grande bibliothèque. Je suis un ambiguë "de base" de l'erreur. Voici une compilable exemple du problème:
#include <iostream>
//I can't change these because they are in the library:
class InteractorStyle {};
class InteractorStyleCamera : public InteractorStyle {};
class InteractorStyleImage : public InteractorStyle {};
//These are my subclasses (so I can change them):
class PointSelector : public InteractorStyle {};
class PointSelector2D : public InteractorStyleCamera, public PointSelector
{
//This function has to exist exactly like this (a requirement of the library):
static PointSelector2D* SafeDownCast(InteractorStyle *o)
{
return static_cast<PointSelector2D *>(o);
}
};
int main()
{
return 0;
}
L'erreur est
erreur: ‘InteractorStyle " est ambigu dans la base de ‘PointSelector2D’.
Est-ce que je peux faire dans ce cas?
- Si vous le savez, l'erreur est parce que les deux
InteractorStyleCamera
etPointSelector
sont dérivées à partir deInteractorStyle
. Désolé de ne pas aider beaucoup de bien 🙂 - Est-il possible de faire
PointSelector
pas hériter?
Vous devez vous connecter pour publier un commentaire.
Votre problème, c'est que Interacteur style est héritée par deux fois - une fois par PointSelector2D et une fois par InteractorStyleCamera. Cela signifie que vous avez 2 versions de chaque membre de contenus au sein de votre classe.
Découvrez:
Comment puis-je éviter le Diamant de la Mort lors de l'utilisation de l'héritage multiple?
Et essayer de l'héritage virtuel.
Vous pouvez superficiellement "résoudre" il par l'utilisation d'un deux-étape de fonte. Par exemple
Bien sûr, vous devez garder à l'esprit que cette "corrige" la syntaxe, mais ne résout pas le problème structurel sous-jacent. Votre
PointSelector2D
a deuxInteractorStyle
de la base de sous-objets à l'intérieur. En fonction de ce quiInteractorStyle
de la base de sous-objets de commencer, la sortie chemin est différent. Et il est très important de prendre le chemin d'accès correct. Ce que j'ai écrit ci-dessus est pourInteractorStyle
à l'intérieur deInteractorStyleCamera
. Pour les autres la base de la bonne sortie seraitSi vous êtes donné un
InteractorStyle *
pointeur avec aucune des informations supplémentaires au sujet de base c'est pointant vers, alors vous ne pouvez peut-être résoudre votre problème avecstatic_cast
. Il n'y a aucun moyen de savoir qui sortie chemin à prendre. En prenant le faux on va produire un totalement dépourvue de sens résultat.Comme il a été noté précédemment,
dynamic_cast
peuvent aider dans cette situation, mais il a des exigences supplémentaires (polymorphe de départ type). Vos types ne sont pas polymorphes (au moins dans votre citée en exemple), de sortedynamic_cast
ne les accepteront pas pour upcasts.Je crois que vous pouvez résoudre ce problème en utilisant un
dynamic_cast
au lieu d'unstatic_cast
. Ledynamic_cast
pouvez regarder l'objet lors de l'exécution pour déterminer lequel des deuxInteractorStyle
classes de base est en cours pointé, et à partir de là peut ajuster le pointeur vers le bas pour le type approprié.vector<string>*
à unint*
alors pourquoistatic_cast
être le problème?static_cast
ne fonctionne que si il y a une ambiguïté abattu à exécuter à partir du type de base pour le type dérivé. Dans ce cas, il y a deux objets de base de typeInteractorStyle
- l'un dePointSelector
et un deInteractorStyleCamera
- de sorte que le compilateur ne peut pas savoir au moment de la compilation lequel des deux objets est en cours pointé, et donc il ne peut pas ajuster le pointeur sur la base de l'objet correct. À l'aide d'un style C cast ici est dangereux parce qu'il ne serait pas ajuster le pointeur. Seulementdynamic_cast
pouvez utiliser les informations d'exécution afin de déterminer comment ajuster le pointeur.static_cast
était essentiellement un style C cast.Vous pouvez obtenir votre code à compiler (j'ai reçu votre exemple pour compiler au moins) par l'ajout de
InteractorStyle
pour les classes quiPointSelector2D
hérite. Si c'est une solution à long terme n'est pas connu par moi.InteractorStyle
en premier dans la liste. Autre que cela, je suppose que ça doit être mon compilateur. Lequel utilisez-vous? Aussi êtes-vous de la compilation de votre code d'exemple ou le vrai projet?