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