وراثت در ++C — راهنمای کاربردی

۱۷۲۷ بازدید
آخرین به‌روزرسانی: ۰۱ مهر ۱۴۰۲
زمان مطالعه: ۴ دقیقه
وراثت در ++C — راهنمای کاربردی

در این مقاله با همه مواردی که به وراثت در ++C مربوط می‌شوند، آشنا خواهید شد. به طور خاص در مورد ماهیت وراثت و روش‌های مختلف برای پیاده‌سازی آن به همراه ارائه مثال صحبت می‌کنیم. برای مطالعه بخش قبلی این سری مقالات روی لینک زیر کلیک کنید:

وراثت یکی از مفاهیم کلیدی برنامه‌نویسی شیءگرا در ++C محسوب می‌شود. این قابلیت به کاربر امکان می‌دهد که کلاس جدیدی (کلاس مشتق) از یک کلاس موجود (کلاس مبنا) بسازد. کلاس مشتق همه ویژگی‌ها را از کلاس مبنا به ارث می‌برد و می‌تواند قابلیت‌های دیگری نیز صرفاً مخصوص خود داشته باشد.

چرا باید از وراثت استفاده کرد؟

تصور کنید در حال طراحی یک بازی هستید و سه کاراکتر می‌خواهید که یکی معلم ریاضی، دیگری فوتبالیست و سومی تاجر است. از آن جا که همه این کاراکترها شخصیت‌های انسانی هستند، می‌توانند راه بروند و صحبت کنند. با این حال هر کدام مهارت‌های خاصی نیز برای خودشان دارند. معلم ریاضیات می‌تواند ریاضیات را تدریس کند، فوتبالیست می‌تواند به بازی فوتبال بپردازد و تاجر می‌تواند یک کسب و کار داشته باشد.

شما می‌توانید به صورت منفرد سه کلاس برای سه شخصیت ایجاد کنید که به آن‌ها امکان راه رفتن، صحبت کردن و اجرای مهارت‌های خاص خودشان را مانند تصویر زیر بدهد:

وراثت در ++C

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

حالت بهتر این است که یک کلاس Person داشته باشید که برخی ویژگی‌های ابتدایی را مانند صحبت کردن، راه رفتن، خوابیدن، خوردن داشته باشد و مهارت‌های هر فرد را به برای هر یک از شخصیت‌ها به صورت جداگانه اضافه کنید. این کار از طریق «وراثت» قابل انجام است.

وراثت در ++C

اینک با بهره‌گیری از وراثت، دیگر کد یکسانی را برای راه رفتن و صحبت کردن برای هر کلاس پیاده‌سازی نمی‌کنیم و می‌توانیم صرفاً آن‌ها را ارث‌بری کنیم.

بنابراین کلاس MathsTeacher (کلاس مشتق) همه ویژگی‌های کلاس Person (کلاس مبنا) را ارث‌بری کرده و قابلیت جدیدی به نام «تدریس ریاضیات» (TeachMaths) نیز اضافه می‌کنیم. به طور مشابه در مورد فوتبالیست باید همه ویژگی‌های یک Person را ارث‌بری کنیم و یک قابلیت جدید به نام «بازی فوتبال» (PlayFootball) به آن اضافه کنیم. بدین ترتیب کد تمیزتر شده و قابلیت درک و گسترش آن افزایش می‌یابد.

به خاطر سپردن این نکته حائز اهمیت است که وقتی با وراثت کار می‌کنیم، هر کلاس مشتق باید همه خصوصیات کلاس مبنا را حتماً داشته باشد. در مثال فوق، معلم ریاضیات خود یک Person است، همچنین فوتبالیست نیز یک Person است. همین نکته در مورد تاجر نیز صدق می‌کند.

پیاده‌سازی وراثت در ++C

1class Person 
2{
3  ... .. ...
4};
5
6class MathsTeacher : public Person 
7{
8  ... .. ...
9};
10
11class Footballer : public Person
12{
13  .... .. ...
14};

در مثال فوق، کلاس Person یک کلاس مبنا است و کلاس‌های MathsTeacher و Footballer از Person مشتق شده‌اند. کلاس مشتق با اعلان کلاس به همراه یک دونقطه آغاز می‌شود، بدین ترتیب کلیدواژه public و نام کلاس مبنا که از آن مشتق شده می‌آید.

از آنجا که MathsTeacher و Footballer از کلاس Person مشتق شده‌اند، همه اعضای داده‌ای و تابع‌های عضو Person از داخل آن‌ها قابل دسترسی هستند.

مثال: وراثت در ++C

در ادامه کاراکترهای بازی را با استفاده از مفهوم وراثت می‌سازیم:

1#include <iostream>
2using namespace std;
3class Person
4{
5     public:
6        string profession;
7        int age;
8        Person(): profession("unemployed"), age(16) { }
9        void display()
10        {
11             cout << "My profession is: " << profession << endl;
12             cout << "My age is: " << age << endl;
13             walk();
14             talk();
15        }
16        void walk() { cout << "I can walk." << endl; }
17        void talk() { cout << "I can talk." << endl; }
18};
19// MathsTeacher class is derived from base class Person.
20class MathsTeacher : public Person
21{
22    public:
23       void teachMaths() { cout << "I can teach Maths." << endl; }
24};
25// Footballer class is derived from base class Person.
26class Footballer : public Person
27{
28    public:
29       void playFootball() { cout << "I can play Football." << endl; }
30};
31int main()
32{
33     MathsTeacher teacher;
34     teacher.profession = "Teacher";
35     teacher.age = 23;
36     teacher.display();
37     teacher.teachMaths();
38     Footballer footballer;
39     footballer.profession = "Footballer";
40     footballer.age = 19;
41     footballer.display();
42     footballer.playFootball();
43     return 0;
44}

خروجی

1My profession is: Teacher
2My age is: 23
3I can walk.
4I can talk.
5I can teach Maths.
6My profession is: Footballer
7My age is: 19
8I can walk.
9I can talk.
10I can play Football.

در این برنامه Person کلاس مبنا است در حالی که MathsTeacher و Footballer از Person مشتق شده‌اند. کلاس Person دو عضو داده‌ای به نام‌های profession و age دارد. همچنین دو تابع عضو به صورت ()walk و ()talk دارد.

هر دو کلاس MathsTeacher و Footballer می‌توانند به همه اعضا داده‌ای و تابع‌های عضو کلاس Person دسترسی داشته باشند. با این حال MathsTeacher و Footballer تابع‌های خاص خود را نیز دارند که به ترتیب شامل ()teachMaths و ()playFootball می‌شود. این تابع‌ها تنها در این کلاس‌ها قابل دسترسی هستند.

در تابع ()main یک شیء جدید به نام teacher در MathsTeacher ایجاد شده است. از آنجا که این شیء به اعضای داده‌ای Person دسترسی دارد، مقادیر profession و age را در کلاس teacher تعیین می‌کند. این داده‌ها با استفاده از تابع ()display که در کلاس Person تعریف‌شده نمایش می‌یابند. ضمناً تابع ()teachMaths که فراخوانی شده در کلاس MathsTeacher تعریف شده است.

به طور مشابه در مورد شیء جدید Footballer نیز در کلاس footballer ایجاد شده است. این شیء به اعضای داده‌ای Person دسترسی دارد که با فراخوانی تابع ()display نمایش می‌یابد. تابع ()playFootball تنها از سوی footballer که متعاقباً فراخوانی می‌شود، قابل دسترسی است.

تعیین‌کننده‌های دسترسی در وراثت

هنگامی که یک کلاس مشتق از یک کلاس مبنا ایجاد می‌کنید، می‌توانید از تعیین‌کننده‌های دسترسی متفاوتی برای ارث‌بری اعضای داده‌ای از کلاس مبنا استفاده کنید. برای نمونه می‌توانید آن‌ها را به صورت «عمومی» (Public)، «حفاظت‌شده» (Protected) و «خصوصی» (Private) تعیین کنید. در مثال فوق کلاس مبنای Person به صورت عمومی از سوی کلاس‌های MathsTeacher و Footballer ارث‌بری شده است.

Override کردن تابع عضو در ارث‌بری

فرض کنید کلاس مبنا و مشتق تابع‌های عضوی با نام و آرگومان‌های یکسان دارند. اگر یک شیء در کلاس مشتق ایجاد کنید و تلاش کنید به آن تابع عضو دسترسی یابید، صرفاً تابع عضو در کلاس مشتق فراخوانی می‌شود. در واقع تابع عضو کلاس مشتق اقدام به Override کردن تابع عضو کلاس مبنا می‌کند.

برای مطالعه بخش بعدی از این مجموعه مقالات آموزشی روی لینک زیر کلیک کنید:

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۶ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
programiz
۱ دیدگاه برای «وراثت در ++C — راهنمای کاربردی»

خیلی عاااااالی

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *