2009-10-14 14 views
21

Compte tenu de cette classe de base:L'utilisation de "Public" dans une déclaration de classe dérivée?

class Employee 
{ 
    char* name; 
    int age; 

    public: 
    Employee(char* name); 
    void print(); 
}; 

En ce qui concerne le "public", quelle est la différence entre ceci:

class Manager : public Employee 
{ 
    EmployeeList employees; 

    public: 
    Manager(char* name, Employee* people); 
    void print(); 
}; 

et ceci:

class Manager : Employee 
{ 
    EmployeeList employees; 

    public: 
    Manager(char* name, Employee* people); 
    void print(); 
}; 
+4

Utilisez std :: string sur char *, et std :: vector sur un pointeur vers un tableau. – GManNickG

+4

Je ne suis pas d'accord. std :: string ajoute une couche de surcharge pour permettre les données de longueur variable. Vous devriez considérer vos besoins et choisir judicieusement. – sep

+2

Sans une bonne connaissance du contexte, les conseils pour utiliser 'std :: vectors' au lieu de C-arrays et 'std :: string' au lieu de C-string ont très peu de valeur, le cas échéant. – AnT

Répondre

3

Sans que 'public' «Employee» deviendrait une classe de base privée de «Manager».

Les classes déclarées avec le mot clé 'class' ont leurs membres privés par défaut et leurs classes de base sont privées par défaut.

Les classes déclarées avec le mot clé 'struct' ont leurs membres publics par défaut et leurs classes de base sont publiques par défaut.

0

En C++, l'héritage est privé par défaut. Toutefois, pour tout code utilisant la classe Manager, il semble y avoir presque aucune différence, car ils ont les mêmes méthodes.

Vous ne pourrez pas convertir l'objet Manager à un employé, cependant. Vous ne pourrez pas non plus accéder à la variable employees à partir de la classe Manager.

+0

Le type d'héritage par défaut dans C++ dépend de la clé de la classe utilisée dans la déclaration de classe. 'class' - privé, 'struct' - public. – AnT

+0

Oui, mais l'OP utilise une classe, donc c'est vrai dans ce contexte. –

+2

Oui, dans ce contexte. Mais pas "en C++". "En C++" suggère un contexte significativement plus général, à mon avis. – AnT

31

L'héritage par défaut est l'héritage privé. prenons cet exemple:

class B { }; 
class D: B { }; 

utilise l'héritage privé comme valeur par défaut. Cela signifie que D reçoit tous les champs et les méthodes publiques et protégées que B a (si l'on en fait déclaré tout), mais ne peut pas être jeté à un B. Par conséquent, ce code échoue:

void foo(B* argument) {} 
foo(new D);     //not allowed 

Si D publiquement hérité de B, alors un D pourrait être converti en B, et cet appel de fonction serait bien.

La deuxième différence est que tous les membres du public et protégés en B deviennent privés membres D.

Qu'est-ce que cela signifie réellement? L'héritage public signifie D IS_A B, mais l'héritage privé signifie "est implémenté en termes de". Hériter D de B signifie que vous voulez profiter de certaines fonctionnalités de B, mais pas parce que D IS_A B ou parce qu'il existe une connexion conceptuelle entre B et D.: D

+1

Réponse fantastique! –

+0

Parfait-juste ce que je cherchais! –

+0

merci, pour d'autres comme moi, cela deviendrait plus clair après avoir lu ce premier: http://stackoverflow.com/a/1372858/1511337 –