وراثت

وراثت به یک کلاس اجازه می دهد که خصوصیات یا متدهایی را از کلاس دیگر به ارث برد. وراثت مانند رابطه پدر و پسری می ماند به طوریکه فرزند خصوصیاتی از قبیل قیافه و رفتار را از پدر خود به ارث برده باشد.

همه متد و خصوصیات کلاس پایه می توانند در کلاس مشتق مورد استفاده قرار بگیرند به استثنای اعضا و متدهای با سطح دسترسی private. مفهوم اصلی وراثت در مثال زیر نشان داده شده است :

   1: #include <iostream>
   2: #include <string>
   3: using namespace std;
   4: 
   5: class Parent
   6: {
   7:     private: 
   8:         string message;
   9: 
  10:     public: 
  11:         void ShowMessage()
  12:         {
  13:             cout << message << endl;
  14:         }
  15: 
  16:         Parent()
  17:         {
  18:         }
  19: 
  20:         Parent(string message)
  21:         {
  22:             this->message = message;
  23:         }
  24: };
  25: 
  26: class Child : public Parent
  27: {
  28:     public:
  29:         Child(string message) : Parent(message)
  30:         {
  31: 
  32:         }
  33: };
  34: 
  35: int main()
  36: {
  37:     Parent myParent("Message from parent.");
  38:     Child myChild("Message from child.");
  39: 
  40:     myParent.ShowMessage();
  41:  
  42:     myChild.ShowMessage();
  43:  
  44:     //myChild.message; ERROR: can't access private members of base class
  45: }
Message from parent.
Message from child.

در این مثال دو کلاس با نامهای Parent و Child تعریف شده است. در این مثال یک فیلد را با سطح دسترسی private (خط 8)و سپس یک متد با سطح دسترسی public (خط 14-11) برای نمایش پیام در کلاس Parent تعریف کرده ایم. یک سازنده در کلاس Parent تعریف شده است که یک آرگومان از نوع رشته قبول می کند و یک پیغام نمایش می دهد (خطوط 23-20). حال به کلاس Child توجه کنید (خطوط 33-26). این کلاس تمام متدها و خاصیت های کلاس Parent را به ارث برده است. در خط 44 همانطور که نشان داده شده است اگر بخواهید از طریق کلاس فرزند به عضوی با سطح دسترسی private دست یابید با پیغام خطا مواجه می شوید. نحوه ارث بری یک کلاس به صورت زیر است :

class DerivedClass : public BaseClass
{
   //some code
};

براحتی می توان با قرار دادن یک کالن ( : ) بعد از نام کلاس و سپس کلمه public و نوشتن نام کلاسی که از آن ارث بری می شود (کلاس پایه) این کار را انجام داد (خط 26). در داخل کلاس Child هم یک سازنده ساده وجود دارد که یک آرگومان رشته ای قبول می کند. وقتی از وراثت در کلاسها استفاده می کنیم، هم سازنده کلاس مشتق و هم سازنده پیشفرض کلاس پایه هر دو اجرا می شوند. سازنده پیشفرض یک سازنده بدون پارامتر است. اگر برای یک کلاس سازنده ای تعریف نکنیم کامپایلر به صورت خودکار یک سازنده برای آن ایجاد می کند. اگر هنگام صدا زدن سازنده کلاس مشتق بخواهیم سازنده کلاس پایه را صدا بزنیم باید بعد از پرانتز سازنده کلاس مشتق نام سازنده کلاس پایه را را بنویسیم و علامت پرانتز هم بگذاریم :

ChildConstractor(type parameter) : ParentConstractor(parameter)
{

} 

در مثال بالا به وسیله تامین مقدار پارامتر message سازنده کلاس مشتق و ارسال آن به داخل پرانتز سازنده کلاس Parent یا والد (خط 29)، سازنده معادل آن در کلاس پایه فراخوانی شده(خط 20) و مقدار message را به آن ارسال می کند. سازنده کلاس Parent هم این مقدار (مقدار message) را در یک عضو داده ای (فیلد) private قرار می دهد (خط 8). می توانید کدهایی را به داخل بدنه سازنده Child اضافه کنید تا بعد از سازنده Parent اجرا شوند. اگر از هیچ آرگومانی استفاده نشود سازنده پیشفرض کلاس پایه فراخوانی می شود :

   1: #include <iostream>
   2: #include <string>
   3: using namespace std;
   4: 
   5: class Parent
   6: {
   7:     private: 
   8:         string message;
   9: 
  10:     public: 
  11:         void ShowMessage()
  12:         {
  13:             cout << message << endl;
  14:         }
  15: 
  16:         Parent()
  17:         {
  18:             cout << "This is default parent constractor!";
  19:         }
  20: 
  21:         Parent(string message)
  22:         {
  23:             this->message = message;
  24:         }
  25: };
  26: 
  27: class Child : public Parent
  28: {
  29:     public:
  30:         Child()
  31:         {
  32: 
  33:         }
  34:         Child(string message) : Parent(message)
  35:         {
  36: 
  37:         }
  38: };
  39: 
  40: int main()
  41: {    
  42:     Child FirstChild;
  43:     Child SecondChild("This is message from child!");
  44: 
  45:     FirstChild.ShowMessage();
  46:     SecondChild.ShowMessage();
  47: }
This is default parent constractor!
This is message from child!

که در کد بالا مشاهده می کنید که دو شیء در خطوط 42 و 43 از کلاس Child ایجاد کرده ایم. همانطور که در خروجی مشاهده می کنید چون در خط 42 هیچ پارامتری به شیء اول نداده ایم در نتیجه سازنده پیشفرض کلاس Parent (خطوط 19-16) و در خط 43 چون به شی ایجاد شده پارامتر داده ایم در نتیجه سازنده خطوط 24-21 فراوخوانی می شود. ++C از وراثت چندگانه هم پشتیبانی می کند. کافیست که بعد از علامت : نام کلاس هایی را که می خواهید یک کلاس از آنها ارث بری کند را ذکر کرده و با کاما از هم جدا کنید :

class A 
{
};

class B 
{
};

class C : public A ,public B 
{
};