Multiple Inheritance
A class inherits from more than one base class.
class A {
public:
void foo() {}
};
class B {
public:
void bar() {}
};
class C : public A, public B {
};
// C gets everything public/protected from both A and B.
C obj;
obj.foo(); // from A
obj.bar(); // from B
Why to use Multiple Inheritance ?
Mix independent capabilities
class Flyable {
public:
void fly();
};
class Swimmable {
public:
void swim();
};
class Duck : public Flyable, public Swimmable {
};
Diamond Problem
class Animal {
public:
int age;
};
class Mammal : public Animal {};
class Bird : public Animal {};
class Bat : public Mammal, public Bird {};
````````Animal
/ \
Mammal Bird
\ /
Bat
Bat b;
b.age = 5; // 💥 ERROR: ambiguous
C++ refuses to guess which age you meant.
Virtual Inheritance
There should be only one shared Animal, no matter how we get there.
class Animal {
public:
int age;
};
class Mammal : virtual public Animal {};
class Bird : virtual public Animal {};
class Bat : public Mammal, public Bird {};
Bat b;
b.age = 5; // ✅ works
Only one Animal subobject exists.
When virtual inheritance is involved, the virtual base class is constructed by the most-derived class (bat here), not by the intermediate base classes.
class Mammal : virtual public Animal {
public:
Mammal() : Animal(10) {}
};
class Bird : virtual public Animal {
public:
Bird() : Animal(20) {}
};
class Bat : public Mammal, public Bird {
};
So the language makes a rule: The most-derived class initializes the virtual base.
Initializing virtual base class
class Animal {
public:
int age;
Animal(int a) : age(a) {
std::cout << "Animal constructed\n";
}
};
class Mammal : virtual public Animal {
public:
Mammal() : Animal(10) { // ❌ ignored
std::cout << "Mammal constructed\n";
}
};
class Bird : virtual public Animal {
public:
Bird() : Animal(20) { // ❌ ignored
std::cout << "Bird constructed\n";
}
};
class Bat : public Mammal, public Bird {
public:
Bat() : Animal(42), Mammal(), Bird() {
std::cout << "Bat constructed\n";
}
};
Construction order:
1. Animal(42) ← constructed ONCE, here
2. Mammal
3. Bird
4. Bat
Other Ambiguity
Even without shared bases, name clashes can happen.
class A {
public:
void f();
};
class B {
public:
void f();
};
class C : public A, public B {};
C obj;
obj.f(); // ❌ ambiguous
Solution 1: Scope resolution
obj.A::f();
obj.B::f();
Solution 2: Override
class C : public A, public B {
public:
void f() {
A::f(); // or custom logic
}
};
Last modified: 08 February 2026