2010-09-28 11 views
41

Supongamos que tengo una base y clase derivada:por defecto el acceso herencia de clases

class Base 
{ 
    public: 
    virtual void Do(); 
} 

class Derived:Base 
{ 
    public: 
    virtual void Do(); 
} 

int main() 
{ 
    Derived sth; 
    sth.Do(); // calls Derived::Do OK 
    sth.Base::Do(); // ERROR; not calls Based::Do 
} 

como se ve que deseen acceder a la Base :: hacer a través de Derivados. Obtengo un error de compilación como "clase Base en inaccesible", sin embargo cuando declaro Derivar como

class Derived: public Base 

funciona bien.

He leído que el acceso de herencia predeterminado es público, entonces ¿por qué tengo que declarar explícitamente la herencia pública aquí?

Respuesta

30

Es posible que haya leído algo incompleto o engañoso. Para citar a Bjarne Stroustrup de "El lenguaje de programación C++", cuarta edición, p. 602:

En un class, los miembros son por defecto private; en un struct, los miembros son por defecto public (§16.2.4).

Esto también se aplica a los miembros heredados sin especificador de nivel de acceso.

Una convención generalizada consiste en utilizar struct solo para la organización de miembros de datos puros. Usó correctamente un class para modelar e implementar el comportamiento del objeto.

+0

@Prasoon sacado de contexto que tiene razón, pero el contexto establecido por el título y el código claramente es "clase" y no "estructura". –

+1

El voto no es mío. Upvoted para contrarrestar. :) –

9

El nivel de herencia predeterminado (en ausencia de un especificador de acceso para una clase base) para class en C++ es privado. [Para struct es pública]

class Derived:Base

Base se hereda de forma privada por lo que no se puede hacer dentro de sth.Base::Do();main() porque Base::Do() es privado dentro Derived

97

a partir de documentos estándar, 11.2.2

En ausencia de un especificador de acceso para una clase base, pública se asume cuando la clase derivada se define con la clase de claveestructura y privada se supone que la clase se define con la clase de claveclase.

Así, por struct s el valor predeterminado es public y para class es, el valor predeterminado es private ...

ejemplos de la propia documentación estándar,

class D3 : B {/.../}; // B private by default

struct D6 : B {/.../}; // B public by default

+22

Esta debería ser la respuesta. – Eloff

+0

Lo secundaré. –

4

El tipo predeterminado de la herencia es privado. En su código,

clase B: Un

no es más que

clase B: Una privado

Cuestiones relacionadas