2012-06-07 12 views
5

Czy możesz mnie zapewnić, jeśli wszystkie specyfikatory dostępu (w tym dziedziczenie) w struct to public?struct i klasa i dziedziczenie (C++)

Innymi słowy: czy są równi?

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

i

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

Mogłeś sam to sprawdzić za pomocą bardzo małego programu. – Nobody

+3

Sprawdź ten wątek na temat różnic między klasami i strukturami w C++ http://stackoverflow.com/questions/92859/what-are-the-differences-between-struct-andclass-in-c –

+2

@Nobody: But wtedy będzie polegał na swoim kompilatorze, który nie ma błędów :) –

Odpowiedz

2

Od C++ standard, 11.2.2, strona 208:

W przypadku braku dostępu-specy fi er dla klasy podstawowej, publicznego zakłada gdy klasa pochodna jest zadeklarowany struct i zakłada prywatny gdy klasa jest deklarowaną klasą.

Więc tak, masz rację: gdy klasa pochodna jest struct, dziedziczy innych klas public chyba że określono inaczej.

7

Tak, wszystkie one są jawne.

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

jest równoważna

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

Dla członków, jest określony w §11:

Członkowie klasy zdefiniowanej w klasie kluczowego są prywatne domyślnie. Członkowie klasy zdefiniowanej za pomocą słów kluczowych struct lub union są domyślnie publiczne.

i dla klas bazowych w §11.2:

W przypadku braku dostępu-specyfikacją dla klasy podstawowej, publicznego zakłada gdy klasa pochodna jest zdefiniowana klasa-key i struct private przyjmuje się, gdy klasa jest zdefiniowana klasą class-key.

gdzie referencje odnoszą się do standardu C++ 11.

2

od C++ 11 standardowe (N3242 draft)

11,2 dostępności klas bazowych i członków klasy bazowych

2 W przypadku braku dostępu-specyfikacją dla klasy bazowej publicznej jest przyjęto, gdy klasa pochodna jest zdefiniowana za pomocą struktury klucza klasy , a wartość prywatna jest przyjmowana, gdy klasa jest zdefiniowana klasą klasy klucza.