دروس الوحدة (2/2)
تعدد الأشكال والوظائف الافتراضية
تعدد الأشكال يسمح لنا بمعالجة كائنات من فئات مشتقة مختلفة من خلال مؤشر أو مرجع إلى فئتها الأساسية، مما يضمن استدعاء الإصدار الصحيح من الطريقة في وقت التشغيل (Late Binding).
الوظائف الافتراضية: virtual و override
لتمكين تعدد الأشكال في إحدى الطرق، يجب علينا الإعلان عنها باستخدام الكلمة الأساسية virtual داخل الفئة الأساسية. في الفئات المشتقة، نستخدم محدد override للإشارة بوضوح إلى أننا نتجاوز هذه الطريقة.
class Employee {
public:
virtual void work() {
std::cout << "Generic work" << std::endl;
}
// IMPORTANT: Virtual destructor in base class to avoid memory leaks
virtual ~Employee() = default;
};
class Developer : public Employee {
public:
void work() override {
std::cout << "Writing C++ code" << std::endl;
}
};باستخدام المؤشرات إلى الفئة الأساسية، سيحل C++ الطريقة الصحيحة في وقت التشغيل:
Employee* emp = new Developer();
emp->work(); // Prints "Writing C++ code" instead of "Generic work"
delete emp;فئات مجردة والوظائف الافتراضية البحتة
الوظيفة الافتراضية الخالصة هي وظيفة عضو افتراضي تم تعريفها بـ = 0 في النهاية. إنه يمثل عقدًا رسميًا: لا توفر الفئة الأساسية أي تنفيذ، بل تفوضه بالكامل إلى فئات فرعية.
تسمى الفئة التي تحتوي على وظيفة افتراضية خالصة واحدة على الأقل فئة مجردة ولا يمكن إنشاء مثيل لها مباشرة.
class Instrument {
public:
virtual void play() = 0; // Pure virtual
virtual ~Instrument() = default;
};
class Piano : public Instrument {
public:
void play() override {
std::cout << "Playing piano..." << std::endl;
}
};جربه بنفسك
حدد طريقة افتراضية makeSound() في Animal التي تطبع "Some sound". ثم قم بتجاوزه في فئة Cat باستخدام محدد التجاوز لطباعة "Meow".
إظهار التلميح
تذكر إضافة "افتراضي" إلى طريقة الفئة الأساسية ووضع "تجاوز" بعد قوسي المعلمة في الفئة المشتقة.
الحل متاح بعد 3 من المحاولات
قم بتعريف وظيفة افتراضية خالصة print() تُرجع الفراغ داخل الفئة المجردة Printable. ثم قم بإنشاء فئة المستند التي ترث بشكل عام من Printable وتنفذ طريقة الطباعة () لطباعة "مستند الطباعة".
إظهار التلميح
يتم الإعلان عن وظيفة افتراضية خالصة بالتوقيع `virtual void print() = 0;`. تأكد من أن "المستند" يرث علنًا من "قابل للطباعة".
الحل متاح بعد 3 من المحاولات