Latest web development tutorials

C ++ تعدد الأشكال

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

عندما تدعو C ++ دالة عضو متوسط ​​متعدد الأشكال، ولأداء وظائف مختلفة تبعا لنوع الكائن يتم استدعاء الدالة.

في المثال التالي، تم اشتقاق الشكل الفئة الأساسية لهاتين الفئتين، على النحو التالي:

#include <iostream> 
using namespace std;
 
class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};
class Rectangle: public Shape{
   public:
      Rectangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Rectangle class area :" <<endl;
         return (width * height); 
      }
};
class Triangle: public Shape{
   public:
      Triangle( int a=0, int b=0):Shape(a, b) { }
      int area ()
      { 
         cout << "Triangle class area :" <<endl;
         return (width * height / 2); 
      }
};
// 程序的主函数
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   // 存储矩形的地址
   shape = &rec;
   // 调用矩形的求面积函数 area
   shape->area();

   // 存储三角形的地址
   shape = &tri;
   // 调用三角形的求面积函数 area
   shape->area();
   
   return 0;
}

عندما يتم ترجمة التعليمات البرمجية أعلاه وتنفيذها، وتنتج النتائج التالية:

Parent class area
Parent class area

سبب الخطأ هو الإخراج، استدعاء منطقة () وظيفة تم تعيين كإصدار مترجم الفئة الأساسية، وهذا ما يسمىتعدد الأشكال ثابتة، أو ثابتة وصلة- وظيفة تسمى قبل تنفيذ البرنامج جاهز. أحيانا يطلق عليه أيضاالربط المبكر لأن وظيفة المنطقة () خلال تجميع برنامج تم إعداده.

ولكن الآن، والسماح للبرنامج تعديل طفيف في فئة الشكل، المنطقة الأولى () مكان بيانالظاهري الكلمة، على النحو التالي:

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      virtual int area()
      {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

بعد التعديل، عندما جمعت وأعدم أمام رمز المثال، فإنه سوف ينتج عن النتائج التالية:

Rectangle class area
Triangle class area

في هذه الحالة، والمترجم هو مؤشر لرؤية المحتوى، بدلا من نوعه. وفقا لذلك، منذ ثلاثي عنوان التخزين وكائنات فئة تفصيل في * شكل، وأنه سيتم استدعاء وظيفة منطقتها ().

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

دالة الظاهري

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

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

دالة الظاهري خالصة

قد ترغب في تعريف دالة الظاهري في الفئة الأساسية، لذلك فئة مشتقة تعيد تعريف وظيفة أكثر ملاءمة للكائن، ولكن لا يمكن أن تعطي التنفيذ الفعلي للوظائف الظاهري في الفئة الأساسية، وهذه المرة سيكون هناك استخدام دالة الظاهري خالصة.

يمكننا أن نبني الطبقة منطقة الوظيفة الظاهرية () ليصبح نصها كما يلي:

class Shape {
   protected:
      int width, height;
   public:
      Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      // pure virtual function
      virtual int area() = 0;
};

= 0 يقول المترجم أن وظيفة لا يوجد لديه الجسم، فوق الدالة الظاهري هودالة الظاهري خالصة.