### Inherited Member Access

Access specifiers control the level of access to noninherited class members. The access for an inherited member is controlled in three ways:

- When you declare a member in a base class, you can specify a level of access using the keywords public, private, and protected.
- When you derive a class, you can specify the access level for the base class in the base list.
- You can also restore the access level of inherited members.

Resolution of member names does not depend on the level of access associated with each class member.

Consider the following example:

    class A {
          private:
                int a;
    };
    class B {
          public:
                int a;
    };
    class C : public A, public B {
          void f() { a = 0; }  // ambiguous - is it A::a or B::a?
    };

In this example, class A has a private member a, and class B has a public member a. Class C is derived from both A and B. C does not have access to A::a, but a in the body of f() can still resolve to either A: :a or B::a. For this reason, a is ambiguous in the body of f().

If a class is derived publicly from a base class, a protected static base class member can be accessed by members and friends of any classes derived from that base class. A protected nonstatic base class member can be accessed by members and friends of any classes derived from that base class by using one of the following:

- A pointer to a directly or indirectly derived class
- A reference to a directly or indirectly derived class
- An object of a directly or indirectly derived class

If a class is derived privately from a base class, all protected base class members become private members of the derived class.

Object
Reference

Examples of Inherited Member Access Rules

Access Declarations
Access Resolution
Derivation
Derivation Access of Base Classes
Member Access
Pointer