Je veux un vecteur de pointeurs de classe dérivés comme pointeurs de classe de base
En C++, la classe vector stocke un tableau d'objets. Dans ce cas, je suis de stocker des pointeurs vers des dérivés de la classe d'objets (les Chiens). À un certain point, je veux traiter ce vecteur de pointeurs vers des objets de la classe de base (les Animaux). C'est le "droit"/non controversée? Pourquoi ne puis-je pas le faire?
#include <vector>
using namespace std;
class Animal { };
class Dog : public Animal { };
int main(int argc, char *argv[]) {
vector<Dog*> dogs;
dogs.push_back(new Dog());
dogs.push_back(new Dog());
vector<Animal*> animals = dogs; //This doesn't seem to work.
//This is really what I want to do...
vector<Animal*> all_animals[] = {dogs, cats, birds};
}
L'erreur:
Untitled.cpp:11:18: error: no viable conversion from 'vector<class Dog *>' to 'vector<class Animal *>'
vector<Animal*> animals = dogs;
^ ~~~~
/usr/include/c++/4.2.1/bits/stl_vector.h:231:7: note: candidate constructor not viable: no known conversion from 'vector<Dog *>' to 'const std::vector<Animal *, std::allocator<Animal *> > &' for 1st argument
vector(const vector& __x)
^
source d'informationauteur SharkCop
Vous devez vous connecter pour publier un commentaire.
Il y a un constructeur de copie pour un
std::vector
mais il vous oblige à copier exactement le même type de vecteur. Heureusement, il y a un autre constructeur qui prend une paire d'itérateurs et ajoute tous les éléments de la gamme, de sorte que vous pouvez le faire:Cela crée un nouveau vecteur de
Animal
pointeurs en parcourant chaqueDog
pointeur. ChaqueDog
pointeur est converti enAnimal
pointeur comme il va.Voici un exemple plus complet (à l'aide de C++11):
Vous pouvez Créer votre Chien Vecteur tel que:
Et jeter votre chien les objets avant de les insérer
Plus tard, rejetés lors de l'accès à
Vous pouvez faire ce que vous voulez vraiment faire avec aucun problème du tout! C'est, il suffit de faire:
La raison que votre code ne fonctionne pas de la façon que vous attendez, c'est que:
std::vector<Dog*>
est totalement classe différente destd::vector<Animal*>
.En d'autres termes, le Chien hérite de l'Animal, oui, mais un
std::vector<X>
n'hérite pas destd::vector<Y>
-- peu importe la façon dont X et Y sont liés!Modèles ne donnent pas le vecteur de beaucoup d'intelligence; ils viennent de définir une nouvelle classe. Vous pouvez pensez-y de cette façon:
Ne
vectorOfDogs
inhert devectorOfAnimals
? Clairement pas! Mais tout ce qui a été fait est de changer le nom de la classe à partir destd::vector<Dog*>
àvectorOfDogs
.