Access Control in Inheritance in C++


Access control in inheritance determines how members of a base class are accessed in derived classes. In C++, access control is influenced by access specifiers (public, protected, and private) and the type of inheritance (public, protected, or private).

Access Specifiers

  • Public: Members are accessible from anywhere.
  • Protected: Members are accessible in the base class and derived classes but not outside.
  • Private: Members are accessible only within the base class.

Types of Inheritance

The type of inheritance defines how the access specifiers of the base class affect the derived class:

Base Class Specifier Access in Derived Class (Public Inheritance) Access in Derived Class (Protected Inheritance) Access in Derived Class (Private Inheritance)
Public Public Protected Private
Protected Protected Protected Private
Private Not Inherited Not Inherited Not Inherited

Examples of Access Control in Inheritance

1. Public Inheritance

In public inheritance, public members of the base class remain public in the derived class, and protected members remain protected.

Example:

    #include <iostream>

    class Base {
    public:
        int publicVar = 1;

    protected:
        int protectedVar = 2;

    private:
        int privateVar = 3;
    };

    class Derived : public Base {
    public:
        void show() {
            std::cout << "Public: " << publicVar << std::endl;
            std::cout << "Protected: " << protectedVar << std::endl;
            // privateVar is not accessible
        }
    };

    int main() {
        Derived d;
        d.show();
        std::cout << "Public: " << d.publicVar << std::endl;
        // d.protectedVar is not accessible outside the class
        return 0;
    }
        

Output:

    Public: 1
    Protected: 2
    Public: 1
        

2. Protected Inheritance

In protected inheritance, public and protected members of the base class become protected in the derived class.

Example:

    #include <iostream>

    class Base {
    public:
        int publicVar = 1;

    protected:
        int protectedVar = 2;

    private:
        int privateVar = 3;
    };

    class Derived : protected Base {
    public:
        void show() {
            std::cout << "Public (now Protected): " << publicVar << std::endl;
            std::cout << "Protected: " << protectedVar << std::endl;
        }
    };

    int main() {
        Derived d;
        d.show();
        // d.publicVar is not accessible outside the class
        return 0;
    }
        

Output:

    Public (now Protected): 1
    Protected: 2
        

3. Private Inheritance

In private inheritance, public and protected members of the base class become private in the derived class.

Example:

    #include <iostream>

    class Base {
    public:
        int publicVar = 1;

    protected:
        int protectedVar = 2;

    private:
        int privateVar = 3;
    };

    class Derived : private Base {
    public:
        void show() {
            std::cout << "Public (now Private): " << publicVar << std::endl;
            std::cout << "Protected (now Private): " << protectedVar << std::endl;
        }
    };

    int main() {
        Derived d;
        d.show();
        // d.publicVar is not accessible outside the class
        return 0;
    }
        

Output:

    Public (now Private): 1
    Protected (now Private): 2
        

Conclusion

Access control in inheritance ensures encapsulation while allowing flexibility in class relationships. Understanding access specifiers and inheritance types helps in designing robust and secure object-oriented programs in C++.





Advertisement