چندریختی (Polymorphism)
آشنایی با چندریختی در C++، توابع مجازی و override
چندریختی (Polymorphism)
چندریختی به توانایی کلاسهای مختلف برای پاسخ به یک پیام به روشهای مختلف گفته میشود.
انواع چندریختی
- Compile-time: Overloading, Templates
- Runtime: Virtual Functions, Overriding
توابع مجازی (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 "پیپال";
}
};
بهترین شیوهها
- از virtual برای توابعی که override میشوند استفاده کنید
- از override برای وضوح استفاده کنید (C++11)
- از توابع مجازی خالص برای رابطها استفاده کنید
- مخربها را virtual کنید
نکات مهم
- توابع مجازی در runtime تصمیم میگیرند
- کلاسهای انتزاعی نمیتوانند نمونه شوند
- کلاسهای مشتق باید توابع مجازی خالص را پیادهسازی کنند
- از virtual destructors استفاده کنید
این مبحث بخشی از دوره آموزش کامل C++ است.