C++ Polymorphism

در زبان C++، Polymorphism (چندریختی) یعنی یک رابط (Interface) واحد، رفتارهای متفاوتی در زمان اجرا یا کامپایل داشته باشه.
به بیان ساده: یک نام واحد برای چند کار مختلف.

🔹 انواع Polymorphism

دو نوع اصلی وجود دارد:

  1. Compile-time Polymorphism (در زمان کامپایل)

    • Function Overloading

    • Operator Overloading

  2. Run-time Polymorphism (در زمان اجرا)

    • Virtual Functions و Function Overriding

1️⃣ Compile-time Polymorphism

🔸 Function Overloading

چند تابع با نام یکسان ولی پارامترهای متفاوت:

#include <iostream> using namespace std; class Math { public: int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } }; int main() { Math m; cout << m.add(3, 4) << endl; // خروجی: 7 cout << m.add(2.5, 1.5) << endl; // خروجی: 4 return 0; }

🔸 Operator Overloading

تعریف عملگرها برای رفتار دلخواه:

#include <iostream> using namespace std; class Complex { public: int r, i; Complex(int real, int imag) : r(real), i(imag) {} Complex operator + (const Complex& c) { return Complex(r + c.r, i + c.i); } }; int main() { Complex a(1, 2), b(3, 4); Complex c = a + b; cout << c.r << " + " << c.i << "i\n"; // خروجی: 4 + 6i return 0; }

2️⃣ Run-time Polymorphism

🔸 Virtual Functions و Function Overriding

وقتی یک تابع مجازی (virtual) در کلاس پایه تعریف کنیم، و اون رو در کلاس مشتق override کنیم، تصمیم‌گیری برای اجرای تابع در زمان اجرا انجام میشه.

#include <iostream> using namespace std; class Animal { public: virtual void sound() { // تابع مجازی cout << "Some sound" << endl; } }; class Dog : public Animal { public: void sound() override { cout << "Woof!" << endl; } }; class Cat : public Animal { public: void sound() override { cout << "Meow!" << endl; } }; int main() { Animal* a; // اشاره‌گر پایه Dog d; Cat c; a = &d; a->sound(); // خروجی: Woof! a = &c; a->sound(); // خروجی: Meow! return 0; }

اگر کلمهٔ virtual را نگذاریم، خروجی همیشه نسخهٔ کلاس پایه خواهد بود.

🔹 Pure Virtual & Abstract Class

اگه توابع کاملاً مجازی تعریف کنیم، اون کلاس Abstract میشه و نمی‌تونیم ازش شیء بسازیم:

class Shape { public: virtual void draw() = 0; // pure virtual function };

کلاس مشتق باید ()draw رو پیاده‌سازی کنه.

خلاصه نکات

  • Compile-time: انتخاب تابع یا عملگر در زمان کامپایل (Overloading).

  • Run-time: انتخاب نسخهٔ صحیح تابع در زمان اجرا (Virtual/Override).

  • برای رفتار پویا و چندریختی واقعی، از virtual functions استفاده کنید.