2009-10-14 9 views
21

dado esta clase base:Uso de "Público" en una declaración de clase derivada?

class Employee 
{ 
    char* name; 
    int age; 

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

En lo que respecta al "público", ¿cuál es la diferencia entre esto:

class Manager : public Employee 
{ 
    EmployeeList employees; 

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

y esto:

class Manager : Employee 
{ 
    EmployeeList employees; 

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

Use std :: string sobre char *, y std :: vector sobre un puntero a matriz. – GManNickG

+4

No estoy de acuerdo. std :: string agrega una capa de overheads para permitir datos de longitud variable. Debería considerar sus necesidades y elegir sabiamente. – sep

+2

Sin un buen conocimiento del contexto, los consejos para usar 'std :: vectores' en lugar de C-arrays y 'std :: string' en lugar de C-strings tienen muy poco valor, si corresponde. – AnT

Respuesta

3

Sin ese 'público' 'Empleado' se convertiría en una clase base privada de 'Gerente'.

Las clases declaradas con la palabra clave 'clase' tienen sus miembros privados por defecto, y tienen sus clases base privadas por defecto.

Las clases declaradas con la palabra clave 'struct' tienen sus miembros públicos por defecto, y tienen sus clases base públicas por defecto.

0

En C++, la herencia es privada por defecto. Sin embargo, para cualquier código que use la clase Manager, parece que casi no hay diferencia, ya que tienen los mismos métodos.

Sin embargo, no podrá convertir el objeto Manager en un empleado. Tampoco podrá acceder a la variable employees desde la clase Manager.

+0

El tipo de herencia predeterminado en C++ depende de la clave de clase utilizada en la declaración de clase. 'clase' - privada, 'struct' - pública. – AnT

+0

Sí, pero el OP está utilizando una clase, por lo que esto es cierto en este contexto. –

+2

Sí, en este contexto. Pero no "en C++". "En C++" sugiere un contexto significativamente más general, en mi opinión. – AnT

31

El valor predeterminado es herencia privada. tome este ejemplo:

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

usa la herencia privada como su valor predeterminado. Esto significa que D se lleva todos los campos y métodos que B tiene (si es que en realidad declaramos lo hay) y protegidas públicas, pero no se puede convertir a una B. Por lo tanto, este código falla:

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

Si D públicamente heredado de B, entonces una D podría ser convertida a B, y esta llamada de función estaría bien.

La segunda diferencia es que todos los miembros protected y públicas en privadas B se convierten en miembros en D.

Lo que significa esto realmente? La herencia pública significa D IS_A B, pero la herencia privada significa "se implementa en términos de". Heredar D de B significa que desea aprovechar algunas de las características en B, pero no porque D IS_A B o porque haya una conexión conceptual entre B y D.: D

+1

¡Fantástica respuesta! –

+0

Perfecto, ¡justo lo que estaba buscando! –

+0

gracias, para otros como yo, esto sería más claro después de leer esto primero: http://stackoverflow.com/a/1372858/1511337 –

Cuestiones relacionadas