access specifiers
In a class or struct body define the visibility of following declarators In a inheritance list, define the maximum visibility of inherited members
Contents |
[edit] Syntax
public: declarators | (1) | ||||||||
protected: declarators | (2) | ||||||||
private: declarators | (3) | ||||||||
class identifier : public class_name
|
(4) | ||||||||
class identifier : protected class_name
|
(5) | ||||||||
class identifier : private class_name
|
(6) | ||||||||
[edit] Explanation
- The symbols declared after the specifier have public accessibility
- The symbols declared after the specifier have protected accessibility
- The symbols declared after the specifier have private accessibility
- The inherited members have the same accessibility as the base class ( either protected or public as private won't be visible in the derived class )
- The inherited members have protected accessibility in the derived class
- The inherited members have private accessibility in the derived class
[edit] Member accessibility by specifier
- public
- public members are accessible everywhere, within and outside the class scope
- protected
- protected members are accessible within the class and its methods and in its descendants
- private
- private members can be only accessed within the class and its methods
To grant access to external functions or classes to protected or private members, a friendship declaration must be present in the class body
Inherited private members are still present in the class data but cannot be accessed directly
A class has default private accessibility for inheritance and members, a struct has instead a default public accessibility
[edit] Public member access
This section is incomplete |
[edit] Protected member access
Protected members form the interface for the derived classes (which is distinct from the public interface of the class).
A protected member of a class Base
can only be accessed
Base
Base
, but only when operating on an object of a type that is derived from Base
(including this
)struct Base { protected: int i; private: void g(Base& b, struct Derived& d); }; struct Derived : Base { void f(Base& b, Derived& d) // member function of a derived class { ++d.i; // okay: the type of d is Derived ++i; // okay: the type of the implied '*this' is Derived // ++b.i; // error: can't access a protected member through Base } }; void Base::g(Base& b, Derived& d) // member function of Base { ++i; // okay ++b.i; // okay ++d.i; // okay } void x(Base& b, Derived& d) // non-member non-friend { // ++b.i; // error: no access from non-member // ++d.i; // error: no access from non-member }
When a pointer to a protected member is formed, it must use a derived class in its declaration:
struct Base { protected: int i; }; struct Derived : Base { void f() { // int Base::* ptr = &Base::i; // error: must name using Derived int Base::* ptr = &Derived::i; // okay } };
[edit] Private member access
This section is incomplete |
[edit] Public inheritance
This section is incomplete |
[edit] Protected inheritance
This section is incomplete |
[edit] Private inheritance
This section is incomplete |
This section is incomplete Reason: example |