2010-01-06 27 views

Respuesta

20

La clase derivada necesita los miembros privados aunque no pueda acceder a ellos directamente. De lo contrario, su comportamiento no se basaría en la clase de la que se deriva.

Por ejemplo, pretender que el material es privado:

int i; 

y la clase tiene un geti() y set _(). El valor de i tiene que colocarse en algún lugar, incluso si es privado,

+0

Señor, lo admito, rara vez me encontré con una respuesta tan elegante y sorprendente. Gracias señor por esta respuesta especialmente la última línea :)) –

0

La clase derivada no "hereda" los miembros privados de la clase base de ninguna manera; no puede acceder a ellos, por lo que no los "hereda".

Una instancia de la clase derivada contiene instancias de los miembros privados de la clase base, por razones obvias.

Así que ni siquiera sé a qué te refieres con esa pregunta.

+2

"La clase derivada no" hereda "los miembros privados de la clase base" Sí lo hace, a menos que intente dividir los cabellos sintácticos. –

+1

Supuse que "heredar" significaba "puedo acceder"; esa era la interpretación menos absurda de la pregunta. –

2

La razón es porque las clases derivadas tienen una relación is-a con la superclase.

Una instancia de clase derivada ES una instanciación de superclase ... solo con más (o menos debido a la configuración de algunas funciones de superclase privada) cosas.

+2

Muy confuso para alguien nuevo en OOP – Jaywalker

+0

@Jaywalker No veo cómo es confuso. La clase derivada clase _is-a_ base, y su componente base todavía necesita poder acceder a _its_ variables 'privadas' en sus métodos, independientemente de si permitió que la clase derivada los usara directamente. –

10

Los métodos públicos y protegidos de la clase base aún pueden acceder a variables privadas de la clase base, y estos métodos están disponibles en la clase derivada.

4

La clase base todavía puede usar las variables miembro privadas & métodos.

Si desea que las clases derivadas tengan acceso a los miembros pero los mantenga ocultos del mundo exterior, hágalos protected:.

Aquí hay un ejemplo para ilustrar:

class Base 
{ 
public: 
    Base() : val(42.0f) {}; 
    float GetValue() const 
    { 
    return val_; 
    } 
private: 
    float val_; 
}; 

class Derived : public Base 
{ 
public: 
    float ComputedValue() const 
    { 
    return GetValue() * 2.0f; 
    } 
}; 
4

no se olvide que la clase de base puede tener métodos que no son private, y por lo tanto accesible por la clase derivada. Esos métodos de clase base protected o public aún pueden invocar los métodos de clase base private. Esto es particularmente útil si se quiere bloquear funcionalidad básica de la clase base, tal como con un patrón de aplicación Template Method diseño:

class base 
{ 
public: 

    virtual ~base() { /* ... */ } 

    virtual void base_func() { foo_private(); } 
    virtual void do_func() = 0; 

private: 

    void foo_private() 
    { 
    // pre-do_func() operations 

    do_func(); 

    // post-do_function operations 
    } 

}; 

class derived : public base 
{ 
public: 

    void derived_func() { base_func(); } 

    virtual void do_func() 
    { 
    // Derived class specific operations 
    } 
}; 
2

Como se ha esbozado por otras respuestas aquí, la clase derivada sintácticamente no puede acceder a la miembros privados de la clase base; pero necesita tener una copia de la misma en su diseño de memoria. Piensa en el casting. Usando el lanzamiento de 'C' puedes lanzar un derivado a una base privada. El compilador necesitaría entonces el desplazamiento de memoria correcto para producir un diseño de memoria válido para el objeto base.

Ej.

class Base { 
public: 
    void printA() { 
    a = 10; 
    std::cout << a << std::endl; 
    } 
private: 
    int a; 
}; 
class Derived : private Base{ 
    int b; 
}; 

Derived* d = new Derived; 
Base* b = (Base*)d; 
b->printA(); 
0

cuando se crea objeto de clase derivada, constructor de la clase base también se llama para la creación de objetos base. si los miembros privados de la clase base no tienen memoria asignada, el objeto base estará incompleto.

por lo tanto, el objeto de clase derivado hereda los miembros privados de base, ya que se crean durante la creación del objeto de la clase base, pero no son accesibles como privados.

0

Aunque los miembros privados no son accesibles desde la clase base, son heredados por ellos porque estas propiedades son utilizadas por la clase derivada con la ayuda de funciones no privadas.

No se accede directamente a los miembros privados de la clase base, sino que se derivan por clase base por clase derivada.

Cuestiones relacionadas