C++ Tutorial

Class and Object

Reference

Inheritance and Derivation

Polymorphism and Virtual Functions

Operator Overloading

Template

Exception

Object Oriented Advanced

Input/Output Stream

File Operations

Multiple Inheritance in C++

C++ supports multiple inheritance, allowing a class to inherit from more than one base class. This tutorial will walk you through the concept of multiple inheritance, its syntax, and an example illustrating its usage.

  • Concept of Multiple Inheritance:

Multiple inheritance enables a derived class to inherit characteristics (i.e., data members and member functions) from multiple base classes. This mechanism is beneficial when a class exhibits the features of multiple classes.

  • Syntax:

Here's the general syntax for multiple inheritance in C++:

class DerivedClass : access_specifier1 BaseClass1, access_specifier2 BaseClass2, ... {
    // DerivedClass members
};

The access specifiers (public, protected, or private) define the access levels of base class members in the derived class. If omitted, the default access level is private.

  • Example:

To illustrate multiple inheritance, consider a scenario where we have a class Animal, a class Vehicle, and a derived class AmphibiousVehicle that combines the properties of both animals and vehicles.

#include <iostream>
#include <string>

// Base Class 1: Animal
class Animal {
public:
    void breathe() {
        std::cout << "I can breathe." << std::endl;
    }
};

// Base Class 2: Vehicle
class Vehicle {
public:
    void drive() {
        std::cout << "I can be driven." << std::endl;
    }
};

// Derived Class: AmphibiousVehicle
class AmphibiousVehicle : public Animal, public Vehicle {
public:
    void swim() {
        std::cout << "I can swim." << std::endl;
    }
};

int main() {
    AmphibiousVehicle av;

    av.breathe(); // Calling function from Animal class
    av.drive();   // Calling function from Vehicle class
    av.swim();    // Calling function from AmphibiousVehicle class

    return 0;
}

The AmphibiousVehicle class inherits from both the Animal and Vehicle classes. As a result, objects of the AmphibiousVehicle class can access the member functions of both Animal and Vehicle.

  • Points to remember:
  • Multiple inheritance can lead to ambiguity if the same member name exists in two or more base classes. To resolve this, use the scope resolution operator :: and specify the base class.
  • When working with multiple inheritance, avoid the "diamond problem" by using virtual inheritance, which ensures that only one instance of a shared base class exists within the derived class hierarchy.

That's a brief introduction to multiple inheritance in C++. By extending from multiple base classes, you can create more flexible and powerful classes that combine the features of their parents.

  1. How to use multiple inheritance in C++:

    • Description: Demonstrates the syntax and usage of multiple inheritance in C++.
    • Example Code:
      #include <iostream>
      
      class Base1 {
      public:
          void displayBase1() const {
              std::cout << "Base1" << std::endl;
          }
      };
      
      class Base2 {
      public:
          void displayBase2() const {
              std::cout << "Base2" << std::endl;
          }
      };
      
      class Derived : public Base1, public Base2 {
      public:
          void displayDerived() const {
              std::cout << "Derived" << std::endl;
          }
      };
      
      int main() {
          Derived derivedObj;
          derivedObj.displayBase1();
          derivedObj.displayBase2();
          derivedObj.displayDerived();
      
          return 0;
      }
      
  2. Virtual base classes in multiple inheritance:

    • Description: Introduces virtual base classes to address the "diamond problem" in multiple inheritance.
    • Example Code:
      #include <iostream>
      
      class Base {
      public:
          virtual void display() const {
              std::cout << "Base" << std::endl;
          }
      };
      
      class Derived1 : virtual public Base {
      public:
          // Additional functionality
      };
      
      class Derived2 : virtual public Base {
      public:
          // Additional functionality
      };
      
      class MultipleDerived : public Derived1, public Derived2 {
          // No need to resolve ambiguity
      };
      
      int main() {
          MultipleDerived obj;
          obj.display();
      
          return 0;
      }
      
  3. Ambiguity resolution in multiple inheritance in C++:

    • Description: Demonstrates how to resolve naming ambiguities in multiple inheritance.
    • Example Code:
      #include <iostream>
      
      class Base1 {
      public:
          void display() const {
              std::cout << "Base1" << std::endl;
          }
      };
      
      class Base2 {
      public:
          void display() const {
              std::cout << "Base2" << std::endl;
          }
      };
      
      class Derived : public Base1, public Base2 {
      public:
          // Resolve ambiguity
          void display() const {
              Base1::display();
              Base2::display();
          }
      };
      
      int main() {
          Derived derivedObj;
          derivedObj.display();
      
          return 0;
      }
      
  4. Using interfaces with multiple inheritance in C++:

    • Description: Demonstrates how multiple inheritance can be used to implement interfaces.
    • Example Code:
      #include <iostream>
      
      class Interface1 {
      public:
          virtual void method1() const = 0;
      };
      
      class Interface2 {
      public:
          virtual void method2() const = 0;
      };
      
      class ConcreteClass : public Interface1, public Interface2 {
      public:
          void method1() const override {
              std::cout << "Method 1" << std::endl;
          }
      
          void method2() const override {
              std::cout << "Method 2" << std::endl;
          }
      };
      
      int main() {
          ConcreteClass obj;
          obj.method1();
          obj.method2();
      
          return 0;
      }