الگوریتم اول

لطفا صبر کنید...

وراثت و چندریختی (Inheritance and Polymorphism) در ++C

وراثت و چندریختی دو ویژگی مهم در برنامه‌نویسی شیءگرا هستند که در ++C به‌طور گسترده استفاده می‌شوند. این ویژگی‌ها به شما امکان می‌دهند که کدهای خود را بیشتر قابل استفاده مجدد، مقیاس‌پذیر و انعطاف‌پذیر کنید.

1. وراثت (Inheritance)

وراثت به شما این امکان را می‌دهد که یک کلاس جدید از یک کلاس موجود به ارث ببرید. در این حالت، کلاس جدید (کلاس فرزند) ویژگی‌ها و رفتارهای کلاس موجود (کلاس والد) را به ارث می‌برد. این ویژگی برای استفاده مجدد از کدها و ایجاد سلسله‌مراتب‌های منطقی مفید است.

تعریف وراثت:

در ++C، برای ایجاد یک کلاس فرزند از یک کلاس والد، از کلمه کلیدی public, protected یا private در هنگام تعریف کلاس فرزند استفاده می‌کنیم. این دسترسی‌ها تعیین می‌کنند که اعضای کلاس والد در کلاس فرزند چگونه قابل دسترسی هستند.

class BaseClass {
    // اعضای کلاس والد
};

class DerivedClass : public BaseClass {
    // اعضای کلاس فرزند
};

مثال وراثت:

#include <iostream>
using namespace std;

class Animal {
public:
    void speak() {
        cout << "حیوان صدای خاص خود را دارد." << endl;
    }
};

class Dog : public Animal {  // وراثت از کلاس Animal
public:
    void bark() {
        cout << "سگ واق می‌زند." << endl;
    }
};

int main() {
    Dog dog;
    dog.speak();  // استفاده از متد ارثی speak
    dog.bark();   // استفاده از متد خاص کلاس Dog

    return 0;
}

در این مثال، کلاس Dog از کلاس Animal ارث می‌برد و متد speak را از کلاس والد به ارث می‌گیرد.

دسترسی‌ها در وراثت:

  • public inheritance: اعضای public کلاس والد در کلاس فرزند به‌طور public قابل دسترسی خواهند بود.
  • protected inheritance: اعضای public و protected کلاس والد در کلاس فرزند به‌طور protected قابل دسترسی خواهند بود.
  • private inheritance: اعضای public و protected کلاس والد در کلاس فرزند به‌طور private قابل دسترسی خواهند بود.

 

2. چندریختی (Polymorphism)

چندریختی به شما این امکان را می‌دهد که اشیاء از یک نوع والد را به گونه‌ای استفاده کنید که رفتارهای مختلفی از خود نشان دهند. این ویژگی به شما کمک می‌کند تا برنامه‌های انعطاف‌پذیرتر و قابل توسعه‌تری بنویسید. در ++C، چندریختی معمولاً از طریق توابع مجازی (Virtual Functions) و پیاده‌سازی مجدد (Overriding) متدها در کلاس‌های فرزند استفاده می‌شود.

توابع مجازی (Virtual Functions):

برای فعال‌سازی چندریختی در ++C، باید متدها را در کلاس والد با استفاده از کلمه کلیدی virtual علامت‌گذاری کنید. این کار باعث می‌شود که وقتی یک شی از نوع کلاس فرزند فراخوانی می‌شود، نسخه مناسب از تابع (با توجه به نوع شیء واقعی) اجرا شود.

class BaseClass {
public:
    virtual void speak() {  // تابع مجازی
        cout << "حیوان صدای خاص خود را دارد." << endl;
    }
};

class Dog : public BaseClass {
public:
    void speak() override {  // پیاده‌سازی مجدد تابع
        cout << "سگ واق می‌زند." << endl;
    }
};

class Cat : public BaseClass {
public:
    void speak() override {  // پیاده‌سازی مجدد تابع
        cout << "گربه میو می‌کند." << endl;
    }
};

int main() {
    BaseClass* animal1 = new Dog();
    BaseClass* animal2 = new Cat();

    animal1->speak();  // خروجی: سگ واق می‌زند.
    animal2->speak();  // خروجی: گربه میو می‌کند.

    delete animal1;
    delete animal2;

    return 0;
}

در این مثال، با استفاده از توابع مجازی، متد speak در کلاس‌های Dog و Cat مجدداً پیاده‌سازی شده است و رفتار مختلفی نشان داده می‌شود، حتی زمانی که از اشاره‌گر به نوع پایه (BaseClass) استفاده می‌شود.

ویژگی‌های چندریختی:

  • اجرا در زمان اجرا (Runtime Polymorphism): انتخاب اینکه کدام نسخه از متد اجرا شود، در زمان اجرا انجام می‌شود، نه در زمان کامپایل.
  • اشاره‌گرهای پایه و ارث‌بری: برای استفاده از چندریختی، باید از اشاره‌گر یا ارجاع به کلاس پایه برای نگهداری اشیاء از کلاس‌های فرزند استفاده کنیم.

 

3. انواع چندریختی در ++C

  • چندریختی در توابع (Function Overloading): زمانی که چندین تابع با نام یکسان در یک کلاس وجود دارد، ولی پارامترهای آن‌ها متفاوت است. این نوع از چندریختی در زمان کامپایل شناسایی می‌شود.

    class Printer {
    public:
        void print(int i) {
            cout << "عدد: " << i << endl;
        }

        void print(string s) {
            cout << "رشته: " << s << endl;
        }
    };

    int main() {
        Printer p;
        p.print(5);      // فراخوانی print(int)
        p.print("Hello"); // فراخوانی print(string)

        return 0;
    }
  • چندریختی در توابع مجازی (Virtual Function Overriding): وقتی یک تابع مجازی در کلاس فرزند بازنویسی می‌شود، به‌طور دینامیک انتخاب می‌شود که کدام نسخه از تابع باید اجرا شود. این نوع از چندریختی در زمان اجرا شناسایی می‌شود.

نتیجه‌گیری:

  • وراثت به شما این امکان را می‌دهد که ویژگی‌ها و رفتارهای یک کلاس را به کلاس‌های دیگر منتقل کنید و از کدهای قبلی استفاده مجدد داشته باشید.
  • چندریختی این امکان را فراهم می‌کند که با استفاده از یک اشاره‌گر یا ارجاع به کلاس پایه، به رفتارهای مختلفی از توابع وابسته به نوع شیء دست پیدا کنید.
  • این دو ویژگی می‌توانند به کدنویسی تمیزتر، مقیاس‌پذیرتر و انعطاف‌پذیرتر در ++C کمک کنند.