2011-11-08 7 views
2

Je crée une liste de classes pour un programme. Cependant, la classe de base a plusieurs enfants, et certains enfants ont aussi des enfants. Aurais-je besoin de modifier ma liste de quelque manière que ce soit pour accommoder les classes héritées? Merci pour toute aide!listes liées avec des classes héritées en C++?

Super, merci pour l'aide! C'est une question incroyablement basique, mais lors de la création d'un cours de petits-enfants, est-ce que ce serait un bon formatage?

Classe C: Public B: Un public {

ou tout simplement

Classe C: B {public?

Répondre

3

suivi le programme suivant:

#include <iostream> 
#include <list> 

struct A 
{ 
    virtual void hello() 
     { std::cout << "Hello from A\n"; } 
}; 

struct B : public A 
{ 
    virtual void hello() 
     { std::cout << "Hello from B\n"; } 
}; 

int main() 
{ 
    std::list<A> l1; 
    std::list<A*> l2; 
    A a; 
    B b; 

    l1.push_back(a); 
    l1.push_back(b); 

    l2.push_back(&a); 
    l2.push_back(&b); 

    l1.front().hello(); 
    l1.back().hello(); 

    l2.front()->hello(); 
    l2.back()->hello(); 
} 

Nous déclarons deux listes, l'une en utilisant des instances de la classe A, et un à l'aide de pointeurs vers A. Vous pouvez mettre des instances de B dans la première liste, car B est un A (en raison de l'héritage). Toutefois, lorsque vous essayez d'accéder aux données et méthodes à partir d'éléments de la première liste, vous ne pouvez pas accéder aux données de B les éléments pensent qu'ils sont de classe A même s'ils ne le sont pas.

Pour la deuxième liste cela fonctionne cependant, en raison de l'utilisation de pointeurs et de la surcharge virtuelle de la méthode.

J'espère que cela aide un peu avec votre question.

1

Vous ne créez probablement pas une liste de classes, mais plutôt des instances de classes. Il y a une grosse différence. Tandis qu'une «classe» est juste la définition des membres et des fonctions de données, une instance remplit réellement cette définition avec la vie. Cela dit, vous ne pouvez pas mettre une instance d'une classe héritée dans une liste qui a la classe parente comme type de stockage. Cela ne fonctionne que si vous stockez des pointeurs ou des références aux instances dans la liste et allouez les instances elles-mêmes ailleurs.

+0

Et vous voudrez probablement vous assurer que la classe de base a un destructeur virtuel, ou vous pourriez vous retrouver avec de fâcheuses fuites de mémoire. –

0

Problème avec les conteneurs STL et l'héritage est que les conteneurs STL stockent copies d'objets, donc toutes les propriétés étendues des classes enfant sont perdues en cours. La solution consiste à laisser les objets seuls et à ne pas les copier.

Dans les conteneurs STL, vous pouvez stocker des pointeurs [intelligents] dans la classe de base, de sorte que seul le pointeur sera copié. Ou vous pouvez aller avec des listes intrusives comme Boost::Intrusive ou queue.h

0

il est seulement:

class C: public B {

et bien sûr:

class B : public A { 

C est une sous-classe de B qui est une sous-classe A.

Si vous voulez une liste d'un mélange d'instances de A, B et C, vous devez le déclarer:

list<A*> myClassList; 
Questions connexes