كورس 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)
وسنبني:
- نظام تسجيل مستخدمين
- نظام حفظ واسترجاع بيانات
- مشروع قاعدة بيانات نصية مصغرة
وهي خطوة مهمة قبل دخول المستوى المتقدم. 🚀

تعليقات
إرسال تعليق