C++ Multiple Inheritance

در ++C می‌تونیم یک کلاس رو طوری تعریف کنیم که از چند کلاس پایه به‌صورت همزمان ارث‌بری کنه. این ساختار رو Multiple Inheritance می‌گیم.

🔹 تعریف کلی
یعنی یک کلاس می‌تونه ویژگی‌ها و توابع چند کلاس مختلف رو به ارث ببره:

کلاس A \ → کلاس C کلاس B /

کلاس C همزمان از A و B ارث می‌بره.

🔹 نمونه کد ساده

#include <iostream> using namespace std; class Animal { public: void eat() { cout << "I can eat!" << endl; } }; class Bird { public: void fly() { cout << "I can fly!" << endl; } }; // Sparrow از هر دو کلاس Animal و Bird ارث‌بری می‌کنه class Sparrow : public Animal, public Bird { public: void sound() { cout << "Chirp Chirp!" << endl; } }; int main() { Sparrow s; s.eat(); // از Animal s.fly(); // از Bird s.sound(); // تابع خودش return 0; }

📌 خروجی:

I can eat! I can fly! Chirp Chirp!

🔹 ترتیب سازنده‌ها در Multiple Inheritance
اول سازنده‌ی کلاسی که زودتر در لیست ارث‌بری آمده، اجرا میشه:

#include <iostream> using namespace std; class A { public: A() { cout << "Constructor A\n"; } }; class B { public: B() { cout << "Constructor B\n"; } }; class C : public A, public B { public: C() { cout << "Constructor C\n"; } }; int main() { C obj; return 0; }

📌 خروجی:

Constructor A Constructor B Constructor C

🔹 مشکل رایج: Diamond Problem
اگر دو کلاس پایه خودشون از یک کلاس سوم ارث‌بری کرده باشن، و کلاس مشتق از هر دوی اون‌ها ارث‌بری کنه، ویژگی‌های کلاس سوم دوبار به ارث می‌رسه و ابهام ایجاد میشه:

Base / \ A B \ / C

راه‌حل: استفاده از virtual inheritance.

🔹 حل مشکل با virtual inheritance

#include <iostream> using namespace std; class Base { public: void show() { cout << "Base show\n"; } }; class A : virtual public Base {}; class B : virtual public Base {}; class C : public A, public B {}; int main() { C obj; obj.show(); // فقط یک بار از Base ارث‌بری شده return 0; }

📌 خروجی:

Base show

نکات مهم

  • Multiple Inheritance قدرت بالایی برای ترکیب ویژگی‌های مختلف میده.

  • برای جلوگیری از تداخل نام، میشه نام کلاس رو به‌صورت صریح نوشت:

    A::functionName();
  • وقتی چند کلاس پایه یکسان دارن، حتماً از virtual inheritance استفاده کنید تا Diamond Problem پیش نیاد.