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.