التوارث العام والخاص في ++C
التوارث العام والخاص
لاحظت أن الإعلان عن الفئة المشتقة يتضمن الكلمة الحاكمة public كما في :
Class manager : public employee
فما دورها ؟
إن هذه الكلمة تحدد أن الفئة المنتمية للفئة المشتقة تستطيع أن تتعامل مع الدوال المنتمية الأساسية , ولو كانت الفئة المشتقة معرفة private لما أمكن ذلك أنظر الشكل .
شكل الاشتقاق العام والخاص
والغالب من التطبيقات تتطلب أن تعلن الفئة المشتقة عامة , حتي يمكنها التعامل مع دوال الفئة الأساسية وتستفيد من إمكانياتها ولكن قد لا تقتضي ظروف أن يود المبرمج إخفاء الفئة الأساسية تماما . تخيل إنك قد صممت فئة لمصفوفة ورضيت عنها تماما وإنك أردت استخدامها لاشتقاق فئة لمكدس , وأنك تريد ألا تعامل كائنات المكدس كمصفوفات , أي عن طريق المؤثر [] , بل دائما من خلال الدالتين push(),pop() عندئذ تخفي الفئة الأساسية عن الفئة المشتقة , بأن تعلن الأخيرة خاصة .
مستويات التوارث
يمكن إشتقاق فئة مشتقة ففي المثال التالي سوف نشتق من فئة العمال فئة ملاحظين forman نضيف إلي بيانات بيانا بالكمية المنتجة تحت إشرافه (quota) انظر الشكل .
شكل مستويات التوارث
employ2.cpp
// employ2.cpp
// multiple levels of inheritance
// UCS Laboratories
#include <iostream.h>
#include <conio.h>
const int LEN = 80; // maximum length of names
class employee
{
private:
char name[LEN]; // employee name
unsigned long number; // employee number
public:
void getdata()
{
cout << "\n Enter last name: "; cin >> name;
cout << " Enter number: "; cin >> number;
}
void putdata()
{
cout << "\n Name: " << name;
cout << "\n Number: " << number;
}
};
class manager : public employee // management class
{
private:
char title[LEN]; // "vice-president" etc.
double dues; // golf club dues
public:
void getdata()
{
employee::getdata();
cout << " Enter title: "; cin >> title;
cout << " Enter golf club dues: "; cin >> dues;
}
void putdata()
{
employee::putdata();
cout << "\n Title: " << title;
cout << "\n Golf club dues: " << dues;
}
};
class scientist : public employee // scientist class
{
private:
int pubs; // number of publications
public:
void getdata()
{
employee::getdata();
cout << " Enter number of pubs: "; cin >> pubs;
}
void putdata()
{
employee::putdata();
cout << "\n Number of publications: " << pubs;
}
};
class laborer : public employee // laborer class
{
};
class foreman : public laborer // foreman class
{
private:
float quotas; // percent of quotas met successfully
public:
void getdata()
{
laborer::getdata();
cout << " Enter quotas: "; cin >> quotas;
}
void putdata()
{
laborer::putdata();
cout << "\n Quotas: " << quotas;
}
};
void main()
{
laborer l1;
foreman f1;
cout << endl;
cout << "\nEnter data for laborer 1";
l1.getdata();
cout << "\nEnter data for foreman 1";
f1.getdata();
cout << endl;
cout << "\nData on laborer 1";
l1.putdata();
cout << "\nData on foreman 1";
f1.putdata();
getche();
}
ونلفت انتباهك هنا إلي مستويات التوارث لا تعبر عن التسلسل الرئاسي ففئة ملاحظ هنا اشتقت من فئة عامل حيث إنها الأعم بالنسبة لها .
تعليقات
إرسال تعليق