Specyfikatory dostępu dla klas podstawowych
Dwa czynniki kontrolują, które elementy członkowskie klasy podstawowej są dostępne w klasie pochodnej; te same czynniki sterują dostępem do dziedziczonych elementów członkowskich w klasie pochodnej:
Czy klasa pochodna deklaruje klasę podstawową przy użyciu specyfikatora dostępu public w class-head (class-head został opisany w sekcji Gramatyka w Definiowanie typów klas).
Jaki jest dostęp do elementu członkowskiego w klasie podstawowej.
W poniższej tabeli pokazano interakcje między tymi czynnikami oraz sposób, w jaki określają dostęp do elementu członkowskiego klasy podstawowej.
Dostęp do elementu członkowskiego w klasie podstawowej
Prywatny |
Chroniony |
Publiczny |
---|---|---|
Zawsze niedostępne bez względu na dostęp w klasie pochodnej |
Prywatny w klasie pochodnej, jeśli użyjesz dziedziczenia prywatnego |
Prywatny w klasie pochodnej, jeśli użyjesz dziedziczenia prywatnego |
|
Chroniony w klasie pochodnej, jeśli użyjesz dziedziczenia chronionego |
Chroniony w klasie pochodnej, jeśli użyjesz dziedziczenia chronionego |
|
Chroniony w klasie pochodnej, jeśli użyjesz dziedziczenia publicznego |
Publiczny w klasie pochodnej, jeśli użyjesz dziedziczenia publicznego |
Ilustruje to poniższy przykład:
// access_specifiers_for_base_classes.cpp
class BaseClass
{
public:
int PublicFunc(); // Declare a public member.
protected:
int ProtectedFunc(); // Declare a protected member.
private:
int PrivateFunc(); // Declare a private member.
};
// Declare two classes derived from BaseClass.
class DerivedClass1 : public BaseClass
{
};
class DerivedClass2 : private BaseClass
{
};
int main()
{
}
W DerivedClass1, funkcja członkowska PublicFunc jest publicznym elementem członkowskim, a ProtectedFunc jest chronionym elementem członkowskim, ponieważ BaseClass jest publiczną klasą podstawową.PrivateFunc jest prywatna dla BaseClass i niedostępna dla wszystkich klas pochodnych.
W DerivedClass2, funkcje PublicFunc i ProtectedFunc są uważane za prywatne element członkowskie, ponieważ BaseClass jest prywatną klasą podstawową.Ponownie, PrivateFunc jest prywatna dla BaseClass i niedostępna dla wszystkich klas pochodnych.
Możesz zadeklarować klasę pochodną bez specyfikatora dostępu klasy podstawowej.W takim przypadku, dziedziczenie jest uznawane za prywatne, jeśli deklaracja klasy pochodnej używa słowa kluczowego class.Dziedziczenie jest uznawane za publiczne, jeśli deklaracja klasy pochodnej używa słowa kluczowego struct.Na przykład, następujący kod:
class Derived : Base
...
jest równoważny z:
class Derived : private Base
...
Podobnie, następujący kod:
struct Derived : Base
...
jest równoważny z:
struct Derived : public Base
...
Zauważ, że elementy członkowskie zadeklarowane z dostępem prywatnym nie są dostępne dla funkcji ani klas pochodnych, które nie są zadeklarowane przy użyciu deklaracji friend w klasie podstawowej.
Typ union nie może mieć klasy podstawowej.
[!UWAGA]
Podczas określania prywatnej klasy podstawowej, zalecane jest jawne użycie słowa kluczowego private, aby użytkownicy klasy pochodnej rozumieli dostęp do elementu członkowskiego.