Latest web development tutorials

الميراث C ++

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

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

الميراثهو ممثل العلاقة.على سبيل المثال، الثدييات هي حيوان، الكلب هو حيوان ثديي، لذلك، كان الكلب هو حيوان، وهلم جرا.

ومشتقة الفئة الأساسية الفئة

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

class derived-class: access-specifier base-class

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

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

#include <iostream>
 
using namespace std;

// 基类
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// 派生类
class Rectangle: public Shape
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};

int main(void)
{
   Rectangle Rect;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

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

Total area: 35

التحكم في الوصول والميراث

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

يمكننا تلخيص حقوق وصول مختلفة وفقا لنوع الوصول، على النحو التالي:

访问publicprotectedprivate
同一个类yesyesyes
派生类yesyesno
外部的类yesnono

فئة مشتقة يرث كل طريقة الفئة الأساسية، إلا في الحالات التالية:

  • قاعدة منشئ فئة والمدمر ونسخ المنشئ.
  • شركات مثقلة الفئة الأساسية ل.
  • صديق وظيفة الفئة الأساسية.

نوع من الميراث

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

نحن بالكاد يستخدمالمحمية أو يستخدم الميراث الخاصعادة الميراثالعام.عندما أنواع مختلفة من الميراث، اتباع القواعد التالية:

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

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

وراثة متعددة وهذا يعني، أن فئة فرعية لها فئة أصل أكثر من أن يرث خصائص الفئة الأصل أكثر من واحد.

++ فئة C يمكن أن ترث من عضو أكثر من فئة واحدة بناء الجملة التالي:

class <派生类名>:<继承方式1><基类名1>,<继承方式2><基类名2>,…
{
<派生类类体>
};

حيث الميراث وصول معدل هوالجمهور، المحمية أو واحد الخاص،وتستخدم لتزيين كل فئة أساسية، الفئة الأساسية بين كل مفصولة بفاصلة، كما هو مبين أعلاه. الآن دعونا نلقي نظرة على الأمثلة التالية:

#include <iostream>
 
using namespace std;

// 基类 Shape
class Shape 
{
   public:
      void setWidth(int w)
      {
         width = w;
      }
      void setHeight(int h)
      {
         height = h;
      }
   protected:
      int width;
      int height;
};

// 基类 PaintCost
class PaintCost 
{
   public:
      int getCost(int area)
      {
         return area * 70;
      }
};

// 派生类
class Rectangle: public Shape, public PaintCost
{
   public:
      int getArea()
      { 
         return (width * height); 
      }
};

int main(void)
{
   Rectangle Rect;
   int area;
 
   Rect.setWidth(5);
   Rect.setHeight(7);

   area = Rect.getArea();
   
   // 输出对象的面积
   cout << "Total area: " << Rect.getArea() << endl;

   // 输出总花费
   cout << "Total paint cost: $" << Rect.getCost(area) << endl;

   return 0;
}

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

Total area: 35
Total paint cost: $2450