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
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.
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.
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
.
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
.
::
and specify the base class.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.
How to use multiple inheritance in C++:
#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; }
Virtual base classes in multiple inheritance:
#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; }
Ambiguity resolution in multiple inheritance in C++:
#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; }
Using interfaces with multiple inheritance in C++:
#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; }