What is multiple inheritance?
One class inherits from several bases—possible diamond problem; virtual inheritance can resolve shared bases.
Master C++ inheritance: single, multiple, multilevel, hierarchical inheritance. Learn access specifiers, polymorphism, virtual functions, and best practices for OOP.
One Base Class
Multiple Base Classes
Chain of Inheritance
Multiple Derived Classes
Inheritance reuses and extends existing classes. Learn access levels, constructor chaining, function hiding, and how to design sensible IS-A hierarchies without abuse.
Inheritance questions test design sense—not just syntax. Diamond problem and access specifiers are interview favorites.
Inheritance is a fundamental Object-Oriented Programming (OOP) concept that allows a class to acquire properties and behaviors of another class. It promotes code reusability and establishes relationships between classes.
The following table compares all inheritance types in C++ with their syntax, use cases, and characteristics:
| Type | Syntax | When to Use | Characteristics |
|---|---|---|---|
| Single Inheritance | class Derived : public Base { }; | Simple "is-a" relationships, basic reuse | One base class, one derived class |
| Multiple Inheritance | class Derived : public Base1, public Base2 { }; | Combine features from multiple classes | Multiple base classes, one derived class |
| Multilevel Inheritance | class A {}; class B: public A {}; class C: public B {}; | Hierarchical systems, layered abstractions | Chain of inheritance (grandparent-parent-child) |
| Hierarchical Inheritance | class Base {}; class D1: public Base {}; class D2: public Base {}; | Multiple specialized classes from one base | One base class, multiple derived classes |
| Hybrid Inheritance | Combination of multiple types | Complex class hierarchies, special cases | Multiple + hierarchical, uses virtual inheritance |
| Virtual Inheritance | class Derived : virtual public Base { }; | Solve diamond problem in multiple inheritance | Prevents duplicate base class instances |
Access specifiers determine how base class members are accessible in derived classes. C++ provides three access specifiers: public, protected, and private.
// Base class
class Base {
public:
int publicVar;
protected:
int protectedVar;
private:
int privateVar;
};
// Derived class with different access modes
class Derived : public Base {
// public inheritance:
// publicVar remains public
// protectedVar remains protected
// privateVar is inaccessible
};
class Derived : protected Base {
// protected inheritance:
// publicVar becomes protected
// protectedVar remains protected
// privateVar is inaccessible
};
class Derived : private Base {
// private inheritance:
// publicVar becomes private
// protectedVar becomes private
// privateVar is inaccessible
}
class Base { public: int x; };
class D : public Base { };class Base { protected: int x; };
class D : public Base { void f(){ x=1; } };class Base { private: int x; };
// D cannot access xclass D : protected Base { };
// public members become protectedclass D : private Base { };
// public members become privateclass D : private Base {
public:
using Base::show;
};public inheritance for "is-a" relationshipsprivate inheritance for "implemented-in-terms-of"Single inheritance is the simplest form where a derived class inherits from only one base class.
class Base {
// Base class members
};
class Derived : access-specifier Base {
// Derived class members
};
class Person { string name; };
class Student : public Person { int roll; };Student(string n,int r) : Person(n), roll(r) {}void display() override { cout << name; }Student s("Ali", 101);
s.display();class Employee : public Person {
double salary;
};void info() { Person::display(); cout << roll; }Multiple inheritance allows a class to inherit from more than one base class, combining their features.
class Base1 {
// First base class
};
class Base2 {
// Second base class
};
class Derived : public Base1, public Base2 {
// Inherits from both Base1 and Base2
};
class A { public: void fa(); };
class B { public: void fb(); };
class C : public A, public B {};class Printable { virtual void print()=0; };
class Saveable { virtual void save()=0; };
class File : public Printable, public Saveable {};class X { int v; };
class Y { int v; };
class Z : public X, public Y {};Z z;
z.X::v = 1;
z.Y::v = 2;class Worker : public Person, public Payable {};void print() override {}
void save() override {}Multilevel inheritance involves a chain of inheritance where a class is derived from another derived class.
class Grandparent {
// Base class
};
class Parent : public Grandparent {
// Intermediate class
};
class Child : public Parent {
// Most derived class
};
class A {};
class B : public A {};
class C : public B {};class Animal { protected: int age; };
class Mammal : public Animal {};
class Dog : public Mammal {};Dog() : Mammal(), Animal() {}void speak() override { cout << "Bark"; }cout << age; // from AnimalPrefer composition over very deep treesHierarchical inheritance involves multiple derived classes inheriting from a single base class.
class Shape { virtual double area()=0; };
class Circle : public Shape {};
class Rect : public Shape {};Shape* s = new Circle(3);
cout << s->area();class Employee { };
class Manager : public Employee {};
class Dev : public Employee {};double bonus() override { return salary*0.2; }vector team; for (auto* e : team) e->display();Polymorphism allows objects of different classes to be treated as objects of a common base class. Virtual functions enable runtime polymorphism.
Function that can be overridden in derived classes.
class Base {
public:
virtual void show() {
cout << "Base show";
}
};
class Derived : public Base {
public:
void show() override {
cout << "Derived show";
}
};
Makes class abstract (cannot be instantiated).
class Abstract {
public:
virtual void pure() = 0;
};
class Concrete : public Abstract {
public:
void pure() override {
// Implementation
}
};
Ensures proper cleanup of derived objects.
class Base {
public:
virtual ~Base() {
// Cleanup
}
};
class Derived : public Base {
public:
~Derived() override {
// Derived cleanup
}
};
virtual void draw() { cout << "Shape"; }void draw() override { cout << "Circle"; }Shape* p = new Circle();
p->draw();virtual double area() = 0;// Shape s; // errordelete p; // calls correct destructor if virtualThe diamond problem occurs in multiple inheritance when a class inherits from two classes that both inherit from the same base class. Virtual inheritance solves this.
class A { int x; };
class B : public A {};
class C : public A {};
class D : public B, public C {};// D has two copies of A::xclass B : virtual public A {};
class C : virtual public A {};class D : public B, public C {};D d;
d.x = 5; // one xUse abstract interfaces to reduce diamond riskclass Animal {};
class Dog : public Animal {};class Car { Engine engine; };virtual ~Resource() = default;void run() override {}// ChocolateLabrador extends Labrador... too deepBase* b = new Derived();
b->use(); // behaves correctlyOne class inherits from several bases—possible diamond problem; virtual inheritance can resolve shared bases.
Yes, but not accessible in derived classes unless using protected or public inheritance with accessible base members.
When HAS-A fits better than IS-A—composition avoids tight coupling and deep fragile hierarchies.