2010-04-02 9 views
2

J'ai une classe parente et une classe enfant (héritées du parent). Dans la classe enfant, j'ai une fonction membre nommée function_blah();comment accéder aux instances enfant dans un vecteur en C++

J'ai utilisé vector<parent*> A pour stocker 5 instances parents, 3 instances enfants. Donc le nombre total d'éléments dans le vecteur est 8.

Je peux facilement accéder aux fonctions membres de l'élément A [0] à A [4], qui sont des instances parents. Mais quand j'essaie d'accéder aux fonctions membres de l'élément A [5] à A [7], le compilateur se plaint que class parent has no member named 'function_blah'

La façon dont j'accède aux éléments est d'utiliser l'index. e.x A [i] avec i = 0..7. Est-ce correct? sinon, comment?

+0

Votre question est incomplète: quelles sont les relations entre les classes 'parent' et la classe enfant? – Klaim

+0

Classe enfant hérite de la classe parente – root

+1

Il dit: "J'ai une classe parente et une classe enfant (héritée du parent)." Je pense que la relation est claire. – Ben

Répondre

5

Vous devez redescendre le pointeur vers la classe enfant pour pouvoir utiliser les fonctions enfants.

Lorsque vous accédez à un objet enfant à l'aide d'un parent*, vous dites au compilateur "traiter cet objet comme parent". Puisque function_blah() n'existe que sur l'enfant, le compilateur ne sait pas quoi faire.

Vous pouvez améliorer cela en en utilisant l' coulée en descente opérateur dynamic_cast:

child* c = dynamic_cast<child*>(A[6]); 
c->function_blah(); 

Ceci effectuera une exécution vérifié, fonte de type sécurisé du parent* à un child* où vous pouvez appeler function_blah().

Cette solution ne fonctionne que si vous savez que l'objet que vous tirant est certainement un child et non un parent. S'il y a incertitude, ce que vous devez faire à la place est d'utiliser l'héritage et de créer une méthode virtuelle sur le parent que vous surchargez sur l'enfant.

+0

Merci beaucoup pour vos suggestions. Je vais utiliser les fonctions virtuelles. – root

2

Vous stockez le parent *, qui n'a pas de méthode function_blah. Vous devez soit faire de function_blah une méthode virtuelle de parent, soit utiliser dynamic_cast pour redescendre vers un enfant *.

0

Le membre _blah() est-il déclaré virtuel dans parent? Ou est-il même déclaré au parent? Parce que sinon, vous ne pourrez jamais accéder à _blah() via un pointeur parent. Et oui, vous devrez également baisser, mais seulement si vous savez exactement que vous attendez un type child.

Questions connexes