2012-06-07 14 views
5

Könnten Sie mir gewährleisten, wenn alle Zugriffsbezeichner (einschließlich Vererbung) in structpublic sind?struct und Klasse und Vererbung (C++)

Mit anderen Worten: Dies sind diejenigen gleich?

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

und

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

Sie haben diese selbst mit einem sehr kleinen Programm getestet konnten. – Nobody

+3

prüft dieses Thema aus über die Unterschiede zwischen Klassen und Strukturen in C++ http://stackoverflow.com/questions/92859/what-are-the-differences-between-struct-and-class-in-c –

+2

@Nobody: Aber dann würde er sich darauf verlassen, dass sein Compiler keine Bugs hat :) –

Antwort

2

Von C++ standard, 11.2.2, Seite 208:

In Ermangelung eines Zugangsspezifischen sich für eine Basisklasse, Öffentlichkeit wird davon ausgegangen, wenn die abgeleitete Klasse Struktur deklariert wird und private angenommen wird, wenn die Klasse ist deklarierte Klasse.

Also ja, sind Sie richtig: wenn die abgeleitete Klasse ein struct ist, es andere Klassen als public erbt, wenn Sie nichts anderes angeben.

7

Ja, sie alle sind öffentlich.

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

entspricht

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

für Mitglieder, es in § 11 angegeben ist:

Mitglieder einer Klasse mit dem Schlüsselwort-Klasse definiert sind standardmäßig privat. Die Mitglieder einer Klasse mit den Schlüsselwort struct oder union definiert sind standardmäßig öffentlich.

und für Basisklassen in §11.2:

In Abwesenheit eines Access-Spezifizierer für eine Basisklasse, öffentlich angenommen wird, wenn die abgeleitete Klasse mit der Klasse-Key-Struktur definiert ist, und private wird angenommen, wenn die Klasse mit der Klassenschlüsselklasse definiert ist.

wo die Verweise auf den C++ 11 Standard sind.

2

Aus der C++ 11 Standard (N3242 draft)

11,2 Zugänglichkeit von Basisklassen und Basisklasse Mitgliedern

2 In Abwesenheit eines Access-Spezifizierer für eine Basisklasse, ist öffentlich angenommen wird, wenn die abgeleitete Klasse mit dem Klassenschlüssel struct und privaten wird angenommen, wenn die Klasse mit dem Klassenschlüssel definiert ist Klasse definiert ist.