وراثت چندگانه، چند سطحی و سلسله مراتبی در ++C — راهنمای کاربردی
در این مقاله با مدلهای مختلف وراثت در زبان برنامهنویسی ++C آشنا میشویم. این مدلها شامل وراثت چندگانه، چند سطحی و سلسله مراتبی در ++C هستند. برای مطالعه بخش قبلی این مجموعه مقالات آموزشی روی لینک زیر کلیک کنید:
وراثت یکی از قابلیتهای اصلی یک زبان برنامهنویسی شیءگرا محسوب میشود. وراثت به توسعهدهندگان امکان میدهد که یک کلاس جدید را از روی کلاس موجود بسازند. کلاس مشتق شده، ویژگیهای کلاس مبنا (یعنی کلاس موجود) را به ارث میبرد. مدلهای مختلفی از وراثت در زبان برنامهنویسی ++C وجود دارند که در ادامه این مقاله آنها را معرفی خواهیم کرد.
وراثت چند سطحی در ++C
در زبان ++C نه تنها میتوان یک کلاس را از کلاس مبنا به ارث بُرد، بلکه میتوان یک کلاس را از یک کلاس مشتق شده نیز مشتق کرد.
این شکل از وراثت به نام وراثت چند سطحی خوانده میشود.
1class A
2{
3... .. ...
4};
5class B: public A
6{
7... .. ...
8};
9class C: public B
10{
11... ... ...
12};
در کد فوق کلاس B از کلاس مبنای A مشتق شده است و کلاس C نیز از کلاس B مشتق شده است.
مثال 1: وراثت چند سطحی در ++C
1#include <iostream>
2using namespace std;
3class A
4{
5 public:
6 void display()
7 {
8 cout<<"Base class content.";
9 }
10};
11class B : public A
12{
13};
14class C : public B
15{
16
17};
18int main()
19{
20 C obj;
21 obj.display();
22 return 0;
23}
خروجی
Base class content.
در این برنامه کلاس C از کلاس B مشتق میشود که خود از کلاس A مشتق شده است. شیء obj از کلاس C در تابع ()main تعریف شده است. زمانی که تابع ()display فراخوانی شود، ()display در کلاس A اجرا میشود. دلیل این امر آن است که تابع ()display در کلاس C و کلاس B وجود ندارد.
کامپایلر ابتدا تابع ()display را در کلاس C جستجو میکند. از آنجا که تابع در آنجا وجود ندارد، به دنبال تابع در کلاس B میگردد، چون C از B مشتق شده است. از آنجا که تابع ()display در کلاس B نیز وجود ندارد، لذا کامپایلر به دنبال آن در کلاس A میگردد، چون B از A مشتق شده است. اگر تابع ()display در کلاس C وجود داشته باشد، کامپایلر تابع ()display کلاس A را باطل (Override) میکند.
وراثت چندگانه در ++C
در زبان ++C یک کلاس میتواند از بیش از یک والد ارثبری کند. برای نمونه در نمودار زیر میبینیم که کلاس Bat از کلاس مبنای Mammal و WingedAnimal ارثبری کرده است. این کار معناداری محسوب میشود، زیرا خفاش یک پستاندار و همچنین از دسته پستانداران بالدار است.
مثال 2: وراثت چندگانه در زبان برنامهنویسی ++C
1#include <iostream>
2using namespace std;
3class Mammal {
4 public:
5 Mammal()
6 {
7 cout << "Mammals can give direct birth." << endl;
8 }
9};
10class WingedAnimal {
11 public:
12 WingedAnimal()
13 {
14 cout << "Winged animal can flap." << endl;
15 }
16};
17class Bat: public Mammal, public WingedAnimal {
18};
19int main()
20{
21 Bat b1;
22 return 0;
23}
خروجی
Mammals can give direct birth. Winged animal can flap.
ابهام در وراثت چندگانه
بدیهیترین مشکل در مورد وراثت چندگانه، در زمان باطل کردن تابع پیش میآید. فرض کنید کلاس مبنا تابع یکسانی دارد که در کلاس مشتق شده باطل نشده است. در این حالت اگر تلاش کنید تابعی که از شیء کلاس مشتق شده بهره میگیرد را فراخوانی کنید، کامپایلر خطایی نشان میدهد. دلیل این خطا آن است که کامپایلر نمیداند کدام خطا را فراخوانی کند. به مثال زیر توجه کنید:
1class base1
2{
3 public:
4 void someFunction( )
5 { .... ... .... }
6};
7class base2
8{
9 void someFunction( )
10 { .... ... .... }
11};
12class derived : public base1, public base2
13{
14
15};
16int main()
17{
18 derived obj;
19 obj.someFunction() // Error!
20}
این مشکل را میتوان با استفاده از تابع شفافسازی دامنه که مشخص میکند کدام تابع به کلاس base1 و یا base2 تعلق دارد، قابل حل است.
1int main()
2{
3 obj.base1::someFunction( ); // Function of base1 class is called
4 obj.base2::someFunction(); // Function of base2 class is called.
5}
وراثت سلسله مراتبی در ++C
اگر بیش از یک کلاس از کلاس مبنا ارثبری بکنند، این کار به نام «وراثت سلسله مراتبی» (hierarchical inheritance) خوانده میشود. در وراثت سلسله مراتبی همه ویژگیهای موجود در کلاسهای فرزند در کلاس مبنا وجود دارند. برای نمونه فیزیک، شیمی، زیستشناسی از کلاس علوم پایه مشتق شدهاند.
ساختار وراثت سلسله مراتبی
1class base_class {
2 ... .. ...
3}
4
5class first_derived_class: public base_class {
6 ... .. ...
7}
8
9class second_derived_class: public base_class {
10 ... .. ...
11}
12
13class third_derived_class: public base_class {
14 ... .. ...
15}
بدین ترتیب به پایان این بخش از سری مقالات راهنمای جامع ++C میرسیم. برای مطالعه بخش بعدی روی لینک زیر کلیک کنید:
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش پیشرفته C++ (شی گرایی در سی پلاس پلاس)
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- وراثت در ++C — راهنمای کاربردی
- کلاس ها و اشیا در ++C — راهنمای جامع
==