2012-02-15 2 views
1

J'ai besoin d'accéder à la variable membre de la classe dérivée à travers la variable de classe de base.Je dois accéder à un membre de la classe dérivée à travers la variable statique de la classe de base

Class A{ 

}; 

Class B:public A { 
    int data; 
}; 

maintenant je dois faire quelque chose comme ça

A *pb = new B() 
pb->data = 10; 

mais le problème est que je ne peux pas accéder à la classe de membre dérivé wihtout il. Et oui, je sais comment le faire fonctionner avec des fonctions virtuelles.

Merci, j'apprécie vraiment votre aide.

Répondre

1

Réponse courte: Vous ne pouvez pas. Parce que votre compilateur ne sait pas ce que pb est. il pourrait être de type A. Cependant, vous utilisez dynamic_cast, ce qui renvoie un pointeur B ou NULL si ce n'est pas possible.

A *pa = new B(); 
B *pb = dynamic_cast<B*>(pa); 
if (pb) { 
    pb->data = 10; 
} 
else { 
    ... 
} 

Quoi qu'il en soit, si vous avez besoin de le faire, cela signifie probablement que vous devriez réviser votre conception comme n'est pas une coulée en source bonne idée. Parfois, cependant, vous ne pouvez pas l'éviter. Par exemple. lors de l'utilisation de bibliothèques externes et autres.

2

Le besoin indique une conception défectueuse.

Mais si vous insistez vraiment pour écrire du code incorrect, vous pouvez simplement retourner à B *.

+0

+1 mais vous devez spécifier que la distribution n'est pas sûre. –

+0

Oui, en fait, mon code n'a pas une situation comme celle-ci. Mais je me demandais juste, si je dois faire quelque chose comme ça ... Mais comment se fait-il que le design soit défectueux, donc vous voulez dire, tous les membres de la classe dérivée doivent être initialisés/modifiés seulement par les constructeurs ???? ou via des fonctions virtuelles ??? – howtechstuffworks

+0

@howtechstuffworks accéder à un membre de la classe dérivée d'un parent signifie que quelque chose ne va pas. Parent est un objet viable en lui-même, et devrait pouvoir exister sans aucun objet dérivé, sauf s'il s'agit d'une classe virtuelle pure. La manière correcte de le faire serait à travers des fonctions virtuelles définies au niveau de la classe parente. – littleadv

2

Sans les fonctions virtuelles, la seule chose que vous pourriez faire est de le baisser. Il y a quelques façons d'aller à ce sujet:

  • Vous pouvez utiliser dynamic_cast si vous avez RTTI activé et vous avez au moins une fonction virtuelle dans la classe parente, qui vous permettra de vérifier pour voir si le casting a réussi ou non . Le fichier static_cast vous permet d'effectuer un cast sur quelque chose en dessous de vous dans votre arbre d'héritage, mais vous perdez la possibilité de vérifier s'il a réussi.
  • Vous pouvez également jeter la prudence au vent complètement et utiliser une fonte de style C.
+0

sans fonctions virtuelles, dynamic_cast n'est pas disponible. –

+0

^Fait sens ...... Je me demandais, si nous avons quelque chose comme des variables virtuelles ou quelque chose, ce qui rendrait la vie plus facile ........ Mais la distribution dynamique est pratique ..... Merci – howtechstuffworks

+0

Bon correction Luchian. Va mettre à jour ma réponse ... –

Questions connexes