3-4- وراثت C++

وراث یکی دیگر از مهمترین مفاهیم در OOP است. اگر دو یا چند کلاس دارید و می‌خواهید توابع داخل این کلاس‌ها را در کلاس جدیدی داشته باشید، می‌توانید از ویژگی وراثت استفاده کنید. با استفاده از ویژگی وراثت، می‌توانید تابع داخل کلاس‌های موجود را مجددا در یک کلاس جدید استفاده کنید. کلاس جدیدی که می‌خواهد از یک کلاس موجود ارث ببرد، یک کلاس مشتق شده یا بچه کلاس نامیده می‌شود. کلاس موجود، کلاس پایه[25] نامیده می‌شود.

یک کلاس می‌تواند به صورت وراثت عمومی، حفاظت شده یا خصوصی ارث ببرد. در ادامه انواع وراثت تشریح می‌شود.

  • وراثت عمومی[26]: هنگامی‌که یک کلاس را از یک کلاس پایه عمومی‌به دست می‌آوریم، اعضای عمومی‌کلاس پایه تبدیل به اعضای عمومی‌کلاس مشتق شده و اعضای محافظت شده کلاس پایه تبدیل به اعضای محافظت شده کلاس مشتق شده می‌شوند. اعضای خصوصی کلاس پایه هرگز در کلاس مشتق شده قابل دسترسی نیستند. پس با فراخوانی اعضای عمومی‌و محافظت شده­ی کلاس پایه می‌توان به آنها دسترسی پیدا کرد.
  • وراثت محافظت شده[27]: هنگامی‌که از کلاس پایه محافظت شده ارث می‌بریم، اعضای عمومی‌و محافظت شده­ی کلاس پایه تبدیل به اعضای محافظت شده­ی کلاس مشتق شده می‌شوند.
  • وراثت خصوصی[28]: هنگامی‌که از کلاس پایه خصوصی ارث می‌بریم، اعضای عمومی‌و محافظت شده­ی کلاس پایه تبدیل به اعضای خصوصی کلاس مشتق شده می‌شوند.

فهرست 2-3 مثالی ساده از وراثت عمومی‌است.

فهرست 2-3. مثالی از وراث عمومی‌C++

#include <iostream>

#include <string>

using namespace std;

class Robot_Class

{

public:

int id;

int no_wheels;

string robot_name;

void move_robot();

void stop_robot();

};

class Robot_Class_Derived: public Robot_Class

{

public:

void turn_left();

void turn_right();

};

void Robot_Class::move_robot()

{

cout<<“Moving Robot”<<endl;

}

void Robot_Class::stop_robot()

{

cout<<“Stopping Robot”<<endl;

}

void Robot_Class_Derived::turn_left()

{

cout<<“Robot Turn left”<<endl;

}

void Robot_Class_Derived::turn_right()

{

cout<<“Robot Turn Right”<<endl;

}

int main()

{

Robot_Class_Derived robot;

robot.id = 2;

robot.robot_name = “Mobile robot”;

cout<<“Robot ID=”<<robot.id<<endl;

cout<<“Robot Name=”<<robot.robot_name<<endl;

robot.move_robot();

robot.stop_robot();

robot.turn_left();

robot.turn_right();

return 0;

}

خوب، در این مثال ما کلاسی جدید به‌نام Robot_Class_ Derived ایجاد کردیم که از کلاس پایه‌ایبه‌نام Robot_Class ارث برده است. وراثت عمومی‌با استفاده از کلید واژه public که به دنبال آن نام کلاس پایه می‌آید صورت می‌پذیرد(به شکل 2-20 نگاه کنید). پس از نام کلاس مشتق شده علامت : باید وجود داشته باشد که به دنبال آن کلید واژه public و نام کلاس پایه می‌آیند.

شکل ‏2‑20: بخشی از کد میراث عمومی

اگر انتخابتان وراثت عمومی‌است، می‌توانید به متغیرها و توابع عمومی‌و محافظت شده کلاس پایه در اینجا Robot_Class دسترسی داشته باشید.

ما از همان کلاسی مثال اول استفاده کردیم. تعریف توابع کلاس مشتق شده در شکل 2-21 نشان داده شده است.

شکل ‏2‑21: تعریف تابع داخل یک کلاس استخراجی

اکنون بیایید نحوه دستیابی به توابع درون کلاس مشتق شده را ببینیم (به شکل 2-22 نگاه کنید).

شکل ‏2‑22: دسترسی به اشیاء کلاس استخراجی

در اینجا یک شی از کلاس Robot_Class_Derived ایجاد کرده و آنرا robot می‌نامیم. اگر به کد رجوع کنید، متغیرهای id و robot_name را در Robot_Class_Derived نمی‌بینید، اما آنها در Robot_Class تعریف شده اند. با استفاده از ویژگی وراثت، به متغیرهای Robot_Class در داخل کلاس مشتق شده دسترسی پیدا کرده‌ایم.

بیایید به خروجی کد نگاهی بیاندازیم. کد را با عنوان class_inherit.cpp ذخیره کرده و آن را با استفاده از دستور زیر کامپایل می‌کنیم.

$g++ class_inherit.cpp -o class_inherit

$ ./class_inherit

خروجی کد در شکل 2-23 بدون اینکه خطایی داشته باشد آمده است که بدان معنا است که وراثت عمومی‌درست کار کرده است.

شکل ‏2‑23: خروجی برنامه کلاس مشتق شده

اگر به خروجی نگاه کنید، تمام پیام‌ها از توابعی که در کلاس پایه و کلاس مشتق شده تعریف شده اند دریافت می‌شوند. بعد از دسترسی به متغیرهای کلاس پایه می‌توانیم مقادیر جدیدی برای آنها تنظیم کنیم.

ما برخی از مفاهیم مهم OOP را ارائه کردیم. برای پی بردن به مفاهیم بیشتر، می‌توانید به وب[29] مراجعه کنید.

[26] Public inheritance

[27] Protected inheritance

[28] Private inheritance

[29] www.tutorialspoint.com/cplusplus

[41] flags

[42] www.cmake.org/documentation/