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