Question

Si j'ai les classes suivantes:

class A
{
    ...
}

class B
{
    ...
}

class C : public A, public B
{
    ...
}

et quelque part, je perçois que le pointeur de B de classe que j'ai en fait des points à un C de classe, mais une fonction nécessite un pointeur vers la classe A, que puis-je faire pour obtenir ce pointeur vers A de classe?

Était-ce utile?

La solution

Si vous savez que pour certains que vous avez un B* qui pointe vers un objet C, vous pouvez utiliser une paire de static_casts:

B* bp = new C();
C* cp = static_cast<C*>(bp);
A* ap = static_cast<A*>(cp);

La seule façon de fonte dans la hiérarchie d'héritage est d'utiliser dynamic_cast, qui exige que le type est polymorphes (qui est, votre classe doit avoir au moins une fonction de membre virtuel; depuis votre classe de destructeurs base doivent être virtual, cela est généralement pas un problème):

B* bp = new C();
A* ap = dynamic_cast<A*>(bp);

dynamic_cast a l'avantage supplémentaire que si elle échoue (qui est, si bp ne pointe pas en fait à un C), elle retourne NULL. Il présente l'inconvénient d'un coût faible performance (static_cast est effectivement libre à l'exécution).

Autres conseils

Le code

class A
{
};
class B
{
};
class C : public A, public B
{
};
int main() {
  C c;
  A *a = &c;
}

est valide puisque C est déjà un A, de sorte que la cession est valide.

Si C hérite d'un comme vous l'avez indiqué, puis un pointeur C * doit être implicitement convertible en A * pointeur. Est-il possible que vous ne l'avez pas compris la déclaration de la classe C, de sorte que le compilateur ne connaît pas cette relation d'héritage? Ou qu'il ya effectivement une autre relation d'héritage que celle donnée dans votre question? Une partie du code serait utile pour diagnostiquer ce problème.

Modifier
Sur la base de la version mise à jour de votre question:

// Converts b to type A*, but only if it is actually
// of type C; otherwise, returns NULL
A* convertBtoAviaC(B* b) {
   C* c = dynamic_cast<C*>(b);
   return c; // note may be NULL, if b is not a C
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top