0Pricing
C++ Academy · درس

الأصناف المجرّدة والطرائق الافتراضية الخالصة

عرّف الواجهات باستخدام الطرائق الافتراضية الخالصة، وافرِض عقود الأصناف المشتقة.

الأصناف المجرّدة والطرائق الافتراضية الخالصة درس مجاني في C++ Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في C++ Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة C++ Academy 4 دروس في المجموع.

ما الفئة المجردة؟

تحتوي الفئة المجردة على دالة افتراضية محضة واحدة على الأقل — مُعلنة باستخدام = 0. ولا يمكنك إنشاء كائن منها مباشرةً.

class Animal {
public:
    virtual void speak() const = 0;   // pure virtual
    virtual ~Animal() = default;
};

// Animal a;     // ERROR: cannot instantiate

الدوال الافتراضية المحضة

تشير = 0 إلى أن الدالة لا تملك تنفيذًا افتراضيًا. ويجب على الفئات المشتقة إعادة تعريفها قبل أن يمكن إنشاء كائن من الفئة.

تنفيذ الواجهة

توفر الفئات المشتقة أجسامًا فعلية لكل دالة افتراضية محضة.

class Dog : public Animal {
public:
    void speak() const override {
        std::cout << "Woof!\n";
    }
};

Dog d;
d.speak();      // Woof!

الفئات المجردة بوصفها واجهات

تؤدي الفئة المجردة التي تحتوي على دوال افتراضية محضة فقط (ولا تحتوي على أعضاء بيانات) دور الواجهة في اللغات الأخرى.

class Drawable {
public:
    virtual void draw() const = 0;
    virtual ~Drawable() = default;
};

الجمع بين التنفيذ والواجهة

يمكن للفئات المجردة أن تحتوي على دوال افتراضية محضة ودوال فعلية معًا. تحدد الدوال الافتراضية المحضة العقد، بينما توفر الدوال الفعلية سلوكًا مشتركًا.

class Logger {
public:
    void logInfo(const std::string& msg) { log("INFO", msg); }
    void logError(const std::string& msg) { log("ERROR", msg); }
protected:
    virtual void log(const std::string& level, const std::string& msg) = 0;
};

دالة افتراضية محضة ذات جسم افتراضي

يمكن أن تمتلك الدالة الافتراضية المحضة جسمًا — ويكون ذلك مفيدًا بوصفه تنفيذًا افتراضيًا يمكن للفئات المشتقة استدعاؤه.

class Base {
public:
    virtual void f() = 0;
};
void Base::f() {
    std::cout << "default behavior\n";
}

class Derived : public Base {
public:
    void f() override {
        Base::f();          // call the default
        std::cout << "extra\n";
    }
};

الاستخدام عبر المؤشرات والمراجع

يحتفظ الكود متعدد الأشكال بالكائنات المجردة عبر مؤشرات أو مراجع إلى النوع الأساسي.

void perform(const Animal& a) {
    a.speak();
}

التخزين في الحاويات

لا يمكن للمتجهات الاحتفاظ بأنواع مجردة بالقيمة. استخدم المؤشرات، وعادةً المؤشرات الذكية.

std::vector<std::unique_ptr<Animal>> zoo;
zoo.push_back(std::make_unique<Dog>());
zoo.push_back(std::make_unique<Cat>());
for (auto& a : zoo) a->speak();

متى تُستخدم الفئات المجردة

استخدمها عندما:

  • تريد تعريف واجهة مشتركة لتنفيذات متعددة غير مترابطة
  • تحتاج إلى نوع أساسي لحاويات متعددة الأشكال
  • تريد حقن السلوك عبر الفئات الفرعية (نمط Template Method)

البدائل: Concepts والقوالب

بالنسبة إلى تعدد الأشكال وقت الترجمة، غالبًا ما تستبدل Concepts في C++20 والقوالب الفئات المجردة — من دون تكلفة وقت تشغيل. استخدم virtual عندما تحتاج إلى تعدد الأشكال وقت التشغيل.

مأزق: الاقتطاع

مرّر الفئات المجردة بالمرجع أو المؤشّر. فالتمرير بالقيمة مستحيل على أي حال (إذ لا يمكن إنشاء كائن من نوع مجرد)، لكن تمرير الفئات المشتقة بالقيمة سيؤدي إلى اقتطاعها.

تحقق سريع

ما الذي يجعل الفئة مجردة في C++؟

مراجعة

تعرّف الفئات المجردة — التي تحتوي على دالة افتراضية محضة واحدة على الأقل — واجهات للكود متعدد الأشكال. استخدمها مع المؤشرات أو المراجع (وغالبًا المؤشرات الذكية) لتوجيه السلوك وقت التشغيل.

الأسئلة الشائعة

هل درس «الأصناف المجرّدة والطرائق الافتراضية الخالصة» مجاني؟

نعم — نص درس «الأصناف المجرّدة والطرائق الافتراضية الخالصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة C++ Academy، انتقل إلى CoddyKit PRO. تتضمن دورة C++ Academy 4 دروس في المجموع.

ماذا ستتعلم في «الأصناف المجرّدة والطرائق الافتراضية الخالصة»؟

عرّف الواجهات باستخدام الطرائق الافتراضية الخالصة، وافرِض عقود الأصناف المشتقة. تتمرن على C++ Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ C++ Academy؟

لا تُشترط خبرة سابقة. C++ Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الأصناف المجرّدة والطرائق الافتراضية الخالصة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس C++ Academy هذا؟

نعم. كل درس في C++ Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الوراثة المفردة والمتعددة
  2. الدوال الافتراضية وvtable
  3. الأصناف المجرّدة والطرائق الافتراضية الخالصة
  4. المفاضلة بين الوراثة والتركيب
← العودة إلى C++ Academy