🔀
Inheritance & Polymorphism

Multiple Inheritance & Diamond Problem

Do Parents Se Inherit Karna
💡 Diamond problem ek family tree jaisa hai jaha do parents ka common grandparent hai — agar dono parents alag-alag "surname" (member) copy karke laaye hain grandparent se, bachche ko pata nahi chalta kaunsa "surname" use kare — ambiguity.

Multiple inheritance mein ek class do (ya zyada) base classes se inherit karti hai — powerful hai, lekin "Diamond Problem" laata hai: agar dono base classes ek common ancestor se inherit karti hain, derived class ke paas ancestor ke members ki DO copies aa jaati hain — ambiguous ho jaata hai kaunsi use karein.

Solution: "virtual inheritance" — base class ko virtual keyword se inherit karo, taaki compiler guarantee kare ki sirf EK shared copy banegi, do nahi.

class Animal {
  public: void eat() { cout << "Eating\n"; }
};

class Dog : virtual public Animal { };     // virtual inheritance
class Cat : virtual public Animal { };

class DogCat : public Dog, public Cat { };  // multiple inheritance

int main() {
  DogCat hybrid;
  hybrid.eat();   // virtual ke bina, ye AMBIGUOUS error deta — kaunsa Animal::eat()?
  return 0;
}
🔀
Diamond problem ek family tree jaisa hai jaha do parents ka common grandparent hai — agar dono parents alag-alag "surname" (member) copy karke laaye hain grandparent se, bachche ko pata nahi chalta kaunsa "surname" use kare — ambiguity.
1 / 2
⚡ झट से Recap
  • Multiple inheritance = ek class, do+ base classes se
  • Diamond problem = common ancestor ki multiple copies = ambiguity
  • virtual inheritance = ek hi shared copy guarantee
इस page में (1 subtopics)

Multiple inheritance complexity (diamond problem) ki wajah se, modern C++ design mein "composition" (has-a, member variables use karke) ko "inheritance" (is-a) se aksar prefer kiya jaata hai jab relationship clearly "is-a" na ho — isse code simpler aur flexible rehta hai.

// Multiple inheritance (complex):
class FlyingCar : public Car, public Airplane { };

// Composition (usually cleaner):
class FlyingCar {
  Engine carEngine;      // has-a Engine
  Wings wings;            // has-a Wings
  public:
    void fly() { wings.flap(); }
    void drive() { carEngine.start(); }
};
💡Tip: Rule of thumb: "is-a" relationship (Dog IS-A Animal) → inheritance. "has-a" relationship (Car HAS-A Engine) → composition (member variable). Multiple inheritance sirf tab jab genuinely multiple "is-a" relationships hon.