استخدام مؤثر النطاق في ++C
استخدام مؤثر النطاق
كيف أمكن للدالتين pop(), push() في الفئة المشتقة أن تستدعي الدوال المقابلة لها في الفئة الأساسية ؟ لقد استخدم لذلك مؤثر النطاق scope resolution علي الصورة :
Stack :: push(var);
Return stack :: pop();
ولولا استخدام هذا المؤثر لظن المترجم أن كل دالة تستدعي نفسها , وهو بالطبع ما لا يقبله فهذا المؤثر يمكنك من أن تحدد أي فئة تنتمي إليها الدالة المطلوبة .
تعديل برنامج الأبعاد الإنجليزية
التطبيق التالي أكثر تطورا في استخدام التوارث , سوف نعدل البرنامج الخاص بالأبعاد الإنجليزية لكي يتضمن الأبعاد السالبة مع الموجبة .
englen.cpp
// englen.cpp
// inheritance using English Distances
// UCS Laboratories
#include <iostream.h>
#include <conio.h>
class Distance // English Distance class
{
protected: // NOTE: can't be private
int feet;
float inches;
public:
Distance() // constructor (no args)
{ feet = 0; inches = 0.0; }
Distance(int ft, float in) // constructor (two args)
{ feet = ft; inches = in; }
void getdist() // get length from user
{
cout << "\nEnter feet: "; cin >> feet;
cout << "Enter inches: "; cin >> inches;
}
void showdist() // display distance
{ cout << feet << "\'-" << inches << '\"'; }
};
enum posneg { pos, neg }; // for sign in DistSign
class DistSign : public Distance // adds sign to Distance
{
private:
posneg sign; // sign is pos or neg
public:
// constructor (no args)
DistSign() : Distance() // call base constructor
{ sign = pos; } // set the sign to +
// constructor (2 or 3 args)
DistSign(int ft, float in, posneg sg=pos) :
Distance(ft, in) // call base constructor
{ sign = sg; } // set the sign
void getdist() // get length from user
{
Distance::getdist(); // call base getdist()
char ch; // get sign from user
cout << "Enter sign (+ or -): "; cin >> ch;
sign = (ch=='+') ? pos : neg;
}
void showdist() // display distance
{
cout << ( (sign==pos) ? "(+)" : "(-)" ); // show sign
Distance::showdist(); // ft and in
}
};
void main()
{
DistSign alpha; // no-arg constructor
alpha.getdist(); // get alpha from user
DistSign beta(11, 6.25); // 2-arg constructor
DistSign gamma(100, 5.5, neg); // 3-arg constructor
// display all distances
cout << "\nalpha = "; alpha.showdist();
cout << "\nbeta = "; beta.showdist();
cout << "\ngamma = "; gamma.showdist();
getche();
}
تضيف الفئة distsign إمكانية التعامل مع الأبعاد السالبة والموجبة , والفئة الأصلية كما هي عدا تحويل نوع البيانات من النوع الخاص إلي النوع المحمي , وهو أجزاء لم يكن من داع له , فالدالة المشتقة ليست بها حاجة للتعامل مع بيانات الدالة الأصلية , ولكنه الإجراء المحبذ كما أشرنا .
الدوال المنتمية للفئة المشتقة
للفئة المشتقة distsign بادئتان , يماثلان ما في الفئة الأصلية , واحدة بلا معامل والثانية ذات معاملين , أو ثلاثة . المعامل الثالث , وهو اختياري ذو قيمتين pos, neg , ووضعه المبدئي هو pos وتشكل البادئتان كائنات الفئة المشتقة بعدة طرق .
كلتا البادئتين تستدعي البادئة المقابلة لها في الفئة الأصلية , كي تحدد الأقدام والبوصات , ثم تضيف من عندها وظيفة ثالثة , هي الإشارة وهي موجبة بحكم الوضع المبدئي .
وقد تطلبت إضافة الإشارة تعديلا في كل دالة من دوال الفئة المشتقة , بالشكل الواضح في البرنامج .
وكما تري تقدم لغة السي ++ أكثر الوسائل كفاءة في الاستفادة من خاصية التوارث فما تريد استخدامه من الفئة الأصلية متاح لك ، سواء أكان بيانا , أم بادئة أم دالة منتمية . وقد لاحظت أننا لم نحتج بالمرة إلي تكرار أمر من الأوامر .
تعليقات
إرسال تعليق