2012-06-07 19 views
5

¿Podría garantizarme si todos los especificadores de acceso (incluida la herencia) en struct son public?struct and class and inheritance (C++)

En otras palabras: ¿son iguales?

class C: public B, public A { public: 
    C():A(1),B(2){} 
    //... 
}; 

y

struct C: B, A { 
    C():A(1),B(2){} 
    //... 
}; 
+0

Podría haber probado esto usted mismo con un programa muy pequeño. – Nobody

+3

Consulte este hilo sobre las diferencias entre clases y estructuras en C++ http://stackoverflow.com/questions/92859/what-are-the-differences-between-struct-and-class-in-c –

+2

@ Nadie: pero entonces él confiaría en que su compilador no tenga errores :) –

Respuesta

2

De C++ standard, 11.2.2, página 208:

En ausencia de un ampli fi de acceso específico para una clase base, pública se asume cuando la clase derivada se declara estructura y se asume privada cuando la clase es clase declarada.

Así que sí, estás en lo correcto: cuando la clase derivada es una struct, hereda otras clases como public a menos que se especifique lo contrario.

7

Sí, todos ellos son públicos.

struct A : B { 
    C c; 
    void foo() const {} 
} 

es equivalente a

struct A : public B { 
public: 
    C c; 
    void foo() const {} 
} 

Para los miembros, se especifica en el § 11:

Los miembros de una clase definida con la clase de palabras clave son privados por defecto. Los miembros de una clase definida con las palabras clave struct o union son públicas por defecto.

y para las clases de bases de §11.2:

En la ausencia de un acceso-especificador para una clase base, se supone público cuando la clase derivada se define con la clave de clase struct-y se asume privado cuando la clase se define con la clase de clave de clase.

donde las referencias son al estándar C++ 11.

2

Desde el C++ 11 estándar (N3242 draft)

11,2 Accesibilidad de clases base y miembros de la clase de base

2 En ausencia de un acceso especificador de una clase base, es pública se asume cuando la clase derivada se define con la estructura de clave de clase y se asume privada cuando la clase se define con la clase de clase class .