在本文中,您將學(xué)習(xí)有關(guān)C ++中繼承的所有知識(shí)。更具體地說(shuō),繼承是什么以及通過(guò)示例實(shí)現(xiàn)繼承的不同方法。
繼承是C ++中面向?qū)ο缶幊痰闹饕δ苤?。它允許用戶從現(xiàn)有的類(基類)創(chuàng)建一個(gè)新的類(派生類)。
派生類繼承了基類的所有功能,并且可以擁有自己的其他功能。
假設(shè)您在游戲中需要三個(gè)角色-一個(gè)數(shù)學(xué)老師(Maths teacher),一個(gè)足球運(yùn)動(dòng)員(Footballer)和一個(gè)商人(Businessman)。
由于所有角色都是人,因此他們可以走路和說(shuō)話。但是,他們各自也有一些特殊技能。數(shù)學(xué)老師可以教數(shù)學(xué),足球運(yùn)動(dòng)員可以踢足球,商人可以經(jīng)營(yíng)企業(yè)。
您可以單獨(dú)創(chuàng)建三個(gè)可以走路,說(shuō)話和執(zhí)行其特殊技能的類,如下圖所示。
在每個(gè)類中,您將為每個(gè)角色復(fù)制相同的Walk(走路)和說(shuō)話(Talk)代碼。
如果要添加新功能-eat(吃飯),則需要為每個(gè)字符實(shí)現(xiàn)相同的代碼。這很容易導(dǎo)致錯(cuò)誤(復(fù)制時(shí))和重復(fù)代碼。
如果我們擁有一個(gè)Person類,它具有基本的功能,例如說(shuō)話,走路,吃飯,睡覺(jué),并根據(jù)我們的角色向這些功能添加特殊技能,那就容易得多。這是使用繼承完成的。
使用繼承,現(xiàn)在您不必為每個(gè)類實(shí)現(xiàn)相同的代碼。您只需要繼承它們即可。
因此,對(duì)于數(shù)學(xué)老師(派生類),您可以繼承Person(基類)的所有功能并添加新功能TeachMaths(教數(shù)學(xué))。同樣,對(duì)于足球運(yùn)動(dòng)員,您繼承了Person的所有功能并添加了新功能PlayFootball(踢足球)等。
這使您的代碼更簡(jiǎn)潔,易于理解和可擴(kuò)展。
重要的是要記?。?/strong>當(dāng)使用繼承時(shí),每個(gè)派生類都應(yīng)該滿足條件,不管它是否是基類。在上面的實(shí)例中,數(shù)學(xué)老師是一個(gè)人,足球運(yùn)動(dòng)員是一個(gè)人。你不可能擁有:商人就是企業(yè)。
class Person { ... .. ... }; class MathsTeacher : public Person { ... .. ... }; class Footballer : public Person { .... .. ... };
在上面的示例中,Person類是基類,而MathsTeacher和Footballer類則是從Person派生出來(lái)的。
派生的類與類的聲明一起出現(xiàn),后跟冒號(hào),關(guān)鍵字public和派生該類的基類名稱。
由于MathsTeacher和Footballer是從Person派生的,因此可以從它們?cè)L問(wèn)Person的所有成員數(shù)據(jù)和成員函數(shù)。
使用繼承概念創(chuàng)建游戲角色。
#include <iostream> using namespace std; class Person { public: string profession; int age; Person(): profession("unemployed"), age(16) { } void display() { cout << "我的職業(yè)是: " << profession << endl; cout << "我的年齡是: " << age << endl; walk(); talk(); } void walk() { cout << "我會(huì)走路。" << endl; } void talk() { cout << "我會(huì)說(shuō)話" << endl; } }; // MathsTeacher類派生自基類Person。 class MathsTeacher : public Person { public: void teachMaths() { cout << "我會(huì)教數(shù)學(xué)。" << endl; } }; // Footballer類派生自基類Person。 class Footballer : public Person { public: void playFootball() { cout << "我會(huì)踢足球。" << endl; } }; int main() { MathsTeacher teacher; teacher.profession = "老師"; teacher.age = 23; teacher.display(); teacher.teachMaths(); Footballer footballer; footballer.profession = "運(yùn)動(dòng)員"; footballer.age = 19; footballer.display(); footballer.playFootball(); return 0; }
輸出結(jié)果
我的職業(yè)是: 老師 我的年齡是: 23 我會(huì)走路。 我會(huì)說(shuō)話 我會(huì)教數(shù)學(xué)。 我的職業(yè)是: 運(yùn)動(dòng)員 我的年齡是: 19 我會(huì)走路。 我會(huì)說(shuō)話 我會(huì)踢足球。
在此程序中,Person是基類,而MathsTeacher和Footballer則從基類Person派生出來(lái)的。
Person類具有兩個(gè)數(shù)據(jù)成員- profession和age。它還具有兩個(gè)成員函數(shù)- walk()和talk()。
既MathsTeacher和Footballer可以訪問(wèn)Person的所有的數(shù)據(jù)成員和成員函數(shù)。
但是,MathsTeacher和Footballer也分別具有自己的成員函數(shù):teachMaths()和playFootball()。這些函數(shù)只能由自己的類訪問(wèn)。
在main()函數(shù)中,創(chuàng)建了一個(gè)新MathsTeacher teacher對(duì)象。
因?yàn)?,它可以訪問(wèn)Person的數(shù)據(jù)成員,因此可以設(shè)置teacher的profession(職業(yè))和age(年齡)。使用Person類中定義的display()函數(shù)顯示此數(shù)據(jù)。 同樣,在MathsTeacher類中定義了teachingMaths()函數(shù)。
同樣,還將創(chuàng)建一個(gè)新Footballer footballer對(duì)象。它也可以訪問(wèn)Person的數(shù)據(jù)成員,也可以通過(guò)調(diào)用display()函數(shù)來(lái)顯示。然后只有足球運(yùn)動(dòng)員(footballer)才能訪問(wèn)的playFootball()函數(shù)。
從基類創(chuàng)建派生類時(shí),可以使用不同的訪問(wèn)說(shuō)明符來(lái)繼承基類的數(shù)據(jù)成員。
這些可以是public, protected 或 private.。
在上面的實(shí)例中,基類Person被MathsTeacher和football公開地繼承了。
了解有關(guān)C ++中的公共繼承,保護(hù)繼承和私有繼承的更多信息。
假設(shè)基類和派生類的成員函數(shù)具有相同的名稱和參數(shù)。
如果創(chuàng)建派生類的對(duì)象并嘗試訪問(wèn)該成員函數(shù),則只能調(diào)用派生類中的成員函數(shù)。
派生類的成員函數(shù)將覆蓋基類的成員函數(shù)。
了解有關(guān)C ++中的函數(shù)重寫的更多信息。