چندریختی (Polymorphism)

آشنایی با چندریختی در C++، توابع مجازی و override

چندریختی (Polymorphism)

چندریختی به توانایی کلاس‌های مختلف برای پاسخ به یک پیام به روش‌های مختلف گفته می‌شود.

انواع چندریختی

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

class Animal {
public:
    virtual void makeSound() {
        cout << "حیوان صدا می‌دهد" << endl;
    }
};

class Dog : public Animal {
public:
    void makeSound() override {
        cout << "سگ: واق واق!" << endl;
    }
};

class Cat : public Animal {
public:
    void makeSound() override {
        cout << "گربه: میو میو!" << endl;
    }
};

استفاده از چندریختی

int main() {
    Animal* animals[2];
    animals[0] = new Dog();
    animals[1] = new Cat();
    
    for (int i = 0; i < 2; i++) {
        animals[i]->makeSound();  // هر کلاس صدای خود را می‌دهد
    }
    
    delete animals[0];
    delete animals[1];
    return 0;
}

توابع مجازی خالص (Pure Virtual Functions)

class Shape {
public:
    virtual double area() = 0;  // تابع مجازی خالص
    virtual double perimeter() = 0;
};

class Rectangle : public Shape {
private:
    double width, height;
    
public:
    Rectangle(double w, double h) : width(w), height(h) {}
    
    double area() override {
        return width * height;
    }
    
    double perimeter() override {
        return 2 * (width + height);
    }
};

class Circle : public Shape {
private:
    double radius;
    
public:
    Circle(double r) : radius(r) {}
    
    double area() override {
        return 3.14159 * radius * radius;
    }
    
    double perimeter() override {
        return 2 * 3.14159 * radius;
    }
};

کلاس‌های انتزاعی (Abstract Classes)

کلاس‌هایی که حداقل یک تابع مجازی خالص دارند.

class Animal {
public:
    virtual void makeSound() = 0;  // کلاس انتزاعی
    virtual void eat() {
        cout << "خوردن" << endl;
    }
};

// نمی‌توان از Animal شیء ساخت
// Animal animal;  // خطا!

مثال کاربردی

class PaymentMethod {
public:
    virtual bool processPayment(double amount) = 0;
    virtual string getName() = 0;
};

class CreditCard : public PaymentMethod {
public:
    bool processPayment(double amount) override {
        cout << "پرداخت " << amount << " با کارت اعتباری" << endl;
        return true;
    }
    
    string getName() override {
        return "کارت اعتباری";
    }
};

class PayPal : public PaymentMethod {
public:
    bool processPayment(double amount) override {
        cout << "پرداخت " << amount << " با پی‌پال" << endl;
        return true;
    }
    
    string getName() override {
        return "پی‌پال";
    }
};

بهترین شیوه‌ها

نکات مهم

این مبحث بخشی از دوره آموزش کامل C++ است.

ابزارهای مرتبط