class Interface{}; class Foo: public Interface{}; class Bar{ public: vector<Interface*> getStuff(); private: vector<Foo*> stuff; }; How do I implement the function getStuff()?
3 Réponses :
vector<Interface*> result(stuff.begin(), stuff.end()); return result;
Répondre à votre question dans les commentaires: ils sont différents de la même manière que deux Les classes avec des membres de types compatibles sont différentes. Exemple: P> std :: vecteur
std :: vecteur
std :: copier code> ou utiliser le constructeur de la plage itérator comme @grozz dit.
EDIT: H3>
Bar& Bar::operator=( const Foo& foo ) {
ptr1 = foo.ptr0;
return *this;
}
Pouvez-vous m'expliquer pourquoi ils sont différents? À mon point de vue sémantiquement tous les "vecteur de ptr_to_inhérité" est aussi un "vecteur de ptr_to_abstract"
Pour que ce véritable vecteur de ptr_to_inhérité devrait hériter du vecteur de ptr_to_abstract, mais std :: vecteur ne sait pas qu'il a besoin de le faire et, par conséquent, ne le fait pas.
@Mat, vous êtes sémantiquement droit, mais la norme C ++ n'a pas pu choisir de mettre en œuvre cela: si vous pensez par exemple d'une classe de modèle FOO qui a des spécialisations différentes de la base et de dérivé, il n'est pas possible que le compilateur de voir Convertir entre FOO
J'utilise cela. Ce n'est pas très gentil, mais je pense vite, je pense :) et vous ne pouvez également renvoyer que référence au vecteur avec cette méthode p>
Je pense que c'est un peu dangereux, et cela ne fonctionnera probablement pas si vous avez plusieurs héritages (je ne recommanderais pas de faire cela), mais je suis d'accord que la copie du vecteur est aussi laide (mais plus sûre ...)
Notez qu'un problème connexe est que
foo ** code > n'est pas convertible à
et héritage multiple / virtuel pourrait faire la conversion d'uninterface ** code>
FOO * code> à une interface
code> non-trivial.