2010-04-04 5 views
1

Salut, je suis un C++ débutant juste rencontré un problème, je ne sais pas comment fixervecteurs de Pointers, héritage

J'ai deux classes, c'est le fichier d'en-tête:

class A 
{ 
public: 
    int i; 
    A(int a); 
}; 

class B: public A 
{ 
public: 
    string str; 
    B(int a, string b); 
};  

je veulent créer un vecteur principal qui stockent soit une classe ou une classe B

vector<A*> vec; 
A objectOne(1); 
B objectTwo(2, "hi"); 
vec.push_back(&objectOne); 
vec.push_back(&objectTwo); 
cout << vec.at(1)->i; //this is fine 
cout << vec.at(1)->str; //ERROR here 

Je suis vraiment confus, j'ai vérifié les sites et les choses, mais je ne sais pas comment le résoudre, s'il vous plaît aider

merci d'avance

Répondre

1

La raison pour laquelle cela ne fonctionne pas est que les objets de votre vecteur sont de type (statique) A. Dans ce contexte, statique signifie la compilation. Le compilateur n'a aucun moyen de savoir que tout ce qui sort de vec sera d'une sous-classe particulière de A. Ce n'est pas une chose légale à faire, donc il n'y a aucun moyen de le faire fonctionner tel quel. Vous pouvez avoir une collection de B, et accéder au membre str, ou à une collection de A et non.

Ceci est en contraste avec un langage tel que Python, où un membre sera recherché dans le dictionnaire d'un objet à l'exécution. C++ est typé statiquement, donc tout votre contrôle de type doit fonctionner lorsque le code est compilé.

0

Tout d'abord, postez le message d'erreur complet.

Deuxièmement, si vous avez un A*, le compilateur ne peut pas déduire qu'une sous-classe (B dans ce cas) a un champ appelé str et que vous obtiendrez une erreur de compilation.