C++ Multiple Inheritance

C++ Tutorial

🧬 C++ Multiple Inheritance

Multiple inheritance in C++ allows a class to inherit from more than one base class.
This means a derived class can combine features of multiple parent classes.


🔹 1. Basic Syntax

class A {
// base class 1
};
class B {
// base class 2
};class C : public A, public B {
// derived class
};


🔹 2. Simple Example

class Camera {
public:
void click() {
cout << "Taking photo" << endl;
}
};
class Phone {
public:
void call() {
cout << “Calling” << endl;
}
};class SmartPhone : public Camera, public Phone {
};

int main() {
SmartPhone s;
s.click(); // from Camera
s.call(); // from Phone
}


🔹 3. Ambiguity Problem

Occurs when both base classes have same method name.

class A {
public:
void show() {
cout << "A";
}
};
class B {
public:
void show() {
cout << “B”;
}
};class C : public A, public B {
};

int main() {
C obj;
// obj.show(); // ❌ ambiguous
}


🔹 4. Resolving Ambiguity (Scope Resolution)

obj.A::show();
obj.B::show();

🔹 5. Diamond Problem

class A {
public:
int x;
};
class B : public A {};
class C : public A {};
class D : public B, public C {
};

D has two copies of A


🔹 6. Solving Diamond Problem (Virtual Inheritance)

class A {
public:
int x;
};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {
};

✔ Only one copy of A


🔹 7. Constructor Call Order

class A {
public:
A() { cout << "A "; }
};
class B {
public:
B() { cout << “B “; }
};class C : public A, public B {
public:
C() { cout << “C “; }
};

Output:

A B C

(Base classes are constructed left to right)


🔹 8. Destructor Call Order

Reverse of constructor:

~C → ~B → ~A

🔹 9. When to Use Multiple Inheritance

✔ Combining independent features
✔ Mixin-like behavior
✔ Interfaces (abstract base classes)

❌ Avoid if it causes ambiguity or tight coupling


🔹 10. Multiple Inheritance vs Interfaces

Use abstract classes to mimic interfaces.

class Printable {
public:
virtual void print() = 0;
};
class Scannable {
public:
virtual void scan() = 0;
};class Machine : public Printable, public Scannable {
public:
void print() { cout << “Printing”; }
void scan() { cout << “Scanning”; }
};


📌 Summary

  • A class can inherit from multiple base classes

  • Can cause ambiguity

  • Use scope resolution or virtual inheritance

  • Diamond problem is a common issue

  • Best used with abstract base classes

You may also like...