Pointeur vers la classe de base
-
27-09-2019 - |
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?
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_cast
s:
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
}