🔥 أحدث الأخبار

موقع يهتم بكل ماهو جديد في عالم التكنولوجيا والرياضة

كورس C++ المتوسط – الحلقة الخامسة: البرمجة الكائنية المتوسطة (OOP Advanced)

 

كورس C++ المتوسط – الحلقة الخامسة: البرمجة الكائنية المتوسطة (OOP Advanced)

#برمجة

مقدمة

مرحباً بك في الحلقة الخامسة من المستوى المتوسط في C++.

في المستوى الأساسي تعرفنا على:

  • Class
  • Object
  • Constructor
  • Encapsulation
  • Inheritance
  • Polymorphism (بشكل مبسط)

أما اليوم فسندخل إلى عالم البرمجة الكائنية الحقيقي الذي تعتمد عليه المشاريع الكبيرة والألعاب والتطبيقات الاحترافية.

سنتعلم:

  • الوراثة المتقدمة (Advanced Inheritance)
  • الدوال الافتراضية (Virtual Functions)
  • تعدد الأشكال الحقيقي (Runtime Polymorphism)
  • الكلاسات المجردة (Abstract Classes)
  • بناء مشروع عملي باستخدام OOP

مراجعة سريعة

ما هو Class؟

الكلاس هو قالب لإنشاء الكائنات.

class Car
{
public:
    string name;
};

ما هو Object؟

Car myCar;

الوراثة (Inheritance)

الوراثة تسمح لك بإنشاء كلاس جديد اعتماداً على كلاس موجود مسبقاً.


مثال بسيط

#include <iostream>
using namespace std;

class Animal
{
public:
    void eat()
    {
        cout << "Animal is eating";
    }
};

class Dog : public Animal
{
};

int main()
{
    Dog d;

    d.eat();

    return 0;
}

ماذا حدث؟

الكلاس Dog ورث جميع الخصائص والدوال من Animal.


مثال أكثر واقعية

#include <iostream>
using namespace std;

class Person
{
public:
    string name;
    int age;
};

class Student : public Person
{
public:
    int mark;
};

int main()
{
    Student s;

    s.name = "Ali";
    s.age = 20;
    s.mark = 95;

    cout << s.name << endl;
    cout << s.age << endl;
    cout << s.mark;

    return 0;
}

أنواع الوراثة

أشهر الأنواع:

  • Single Inheritance
  • Multiple Inheritance
  • Multilevel Inheritance

الوراثة متعددة المستويات

class LivingThing
{
};

class Animal : public LivingThing
{
};

class Dog : public Animal
{
};

تعدد الأشكال (Polymorphism)

معناه:

نفس الأمر يمكن أن يتصرف بطرق مختلفة.


مثال بسيط

#include <iostream>
using namespace std;

class Math
{
public:
    int add(int a, int b)
    {
        return a + b;
    }

    int add(int a, int b, int c)
    {
        return a + b + c;
    }
};

هذا يسمى:

Function Overloading


الدوال الافتراضية (Virtual Functions)

هذه من أهم مفاهيم OOP.


بدون Virtual

#include <iostream>
using namespace std;

class Animal
{
public:
    void sound()
    {
        cout << "Animal Sound";
    }
};

class Dog : public Animal
{
public:
    void sound()
    {
        cout << "Dog Bark";
    }
};

int main()
{
    Animal* a = new Dog();

    a->sound();

    return 0;
}

الناتج:

Animal Sound

لماذا؟

لأن المؤشر من نوع Animal.


الحل: Virtual

#include <iostream>
using namespace std;

class Animal
{
public:
    virtual void sound()
    {
        cout << "Animal Sound";
    }
};

class Dog : public Animal
{
public:
    void sound() override
    {
        cout << "Dog Bark";
    }
};

int main()
{
    Animal* a = new Dog();

    a->sound();

    return 0;
}

الناتج:

Dog Bark

ما فائدة Virtual؟

تسمح للكائن الحقيقي بتنفيذ دالته الخاصة.

وهذا أساس:

  • الألعاب
  • الأنظمة الكبيرة
  • محركات الرسوميات

الكلاسات المجردة (Abstract Classes)

هي كلاسات لا يمكن إنشاء كائن منها مباشرة.


مثال

class Animal
{
public:
    virtual void sound() = 0;
};

لاحظ:

= 0

هذا يسمى:

Pure Virtual Function


تنفيذها في الكلاس الابن

#include <iostream>
using namespace std;

class Animal
{
public:
    virtual void sound() = 0;
};

class Dog : public Animal
{
public:
    void sound() override
    {
        cout << "Bark";
    }
};

int main()
{
    Dog d;

    d.sound();

    return 0;
}

لماذا نستخدم Abstract Class؟

لأنها تفرض على الكلاسات الأبناء تنفيذ دوال معينة.


مثال من الحياة الواقعية

لدينا لعبة.

كل شخصية يجب أن تمتلك:

attack()
move()

لكن طريقة التنفيذ تختلف.


مشروع عملي صغير

نظام موظفين

#include <iostream>
using namespace std;

class Employee
{
protected:
    string name;
    double salary;

public:
    Employee(string n, double s)
    {
        name = n;
        salary = s;
    }

    virtual void showInfo()
    {
        cout << "Name: " << name << endl;
        cout << "Salary: " << salary << endl;
    }
};

class Manager : public Employee
{
public:
    Manager(string n, double s)
    : Employee(n, s)
    {
    }

    void showInfo() override
    {
        cout << "Manager: " << name << endl;
        cout << "Salary: " << salary << endl;
    }
};

int main()
{
    Employee* emp = new Manager("Ahmed", 5000);

    emp->showInfo();

    delete emp;

    return 0;
}

شرح المشروع

استخدمنا:

  • Inheritance
  • Virtual Functions
  • Override
  • Polymorphism

وهي أدوات أساسية في المشاريع الحقيقية.


Access Modifiers

Public

يمكن الوصول إليه من أي مكان.

public:

Private

داخل الكلاس فقط.

private:

Protected

داخل الكلاس والأبناء.

protected:

الفرق بينها

النوع داخل الكلاس الابن خارج الكلاس
private نعم لا لا
protected نعم نعم لا
public نعم نعم نعم

أخطاء شائعة

❌ نسيان virtual عند الحاجة إلى Polymorphism

❌ محاولة إنشاء كائن من Abstract Class

Animal a;

❌ نسيان override

❌ استخدام private عندما تحتاج protected


تمارين

التمرين 1

أنشئ كلاس Vehicle وكلاس Car يرث منه.


التمرين 2

أنشئ دالة virtual باسم move.


التمرين 3

أنشئ Abstract Class باسم Shape.


التمرين 4

أنشئ كلاس Circle ينفذ دالة area.


التمرين 5

اصنع نظام موظفين يحتوي على:

  • Employee
  • Manager
  • Developer

مع استخدام Polymorphism.


ملخص الحلقة الخامسة

في هذه الحلقة تعلمنا:

  • الوراثة المتقدمة
  • Function Overloading
  • Virtual Functions
  • Override
  • Runtime Polymorphism
  • Abstract Classes
  • Pure Virtual Functions
  • Access Modifiers
  • مشروع OOP عملي

في الحلقة السادسة من المستوى المتوسط سنتعلم:

🔥 التعامل مع الملفات بشكل احترافي (Advanced File Handling)

وسنبني:

  • نظام تسجيل مستخدمين
  • نظام حفظ واسترجاع بيانات
  • مشروع قاعدة بيانات نصية مصغرة

وهي خطوة مهمة قبل دخول المستوى المتقدم. 🚀


تعليقات

💬 🙋🏻‍♂️