今天我們來講下 C++ 三大特性之繼承。我們首先來思考下,類與類之間是否存在直接的關(guān)聯(lián)關(guān)系呢?我們還是以之前的講解的電腦為例,說下組合關(guān)系,組合便是整體與部分的關(guān)系,如下
創(chuàng)新互聯(lián)建站是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計,網(wǎng)站模板,微信公眾號開發(fā),軟件開發(fā),小程序制作,10多年建站對展覽展示等多個領(lǐng)域,擁有豐富的網(wǎng)站維護經(jīng)驗。
我們以這個關(guān)系為例,用代碼來描述下
#include <iostream> #include <string> using namespace std; class Memory { public: Memory() { cout << "Memory()" << endl; } ~Memory() { cout << "~Memory()" << endl; } }; class Disk { public: Disk() { cout << "Disk()" << endl; } ~Disk() { cout << "~Disk()" << endl; } }; class CPU { public: CPU() { cout << "CPU()" << endl; } ~CPU() { cout << "~CPU()" << endl; } }; class MainBoard { public: MainBoard() { cout << "MainBoard()" << endl; } ~MainBoard() { cout << "~MainBoard()" << endl; } }; class Computer { Memory mMem; Disk mDisk; CPU mCPU; MainBoard mMainBoard; public: Computer() { cout << "Computer()" << endl; } void power() { cout << "power()" << endl; } void reset() { cout << "reset()" << endl; } ~Computer() { cout << "~Computer()" << endl; } }; int main() { Computer c; return 0; }
我們看到電腦是由硬盤、內(nèi)存、CPU和主板構(gòu)成的,我們看看編譯結(jié)果
確實在生成電腦這個對象時,先是生成了硬盤、內(nèi)存、CPU和主板一系列的東西,在析構(gòu)的時候順便將這些東西也都清理了。那么我們來看看組合關(guān)系的特點:a> 將其它類的對象作為當(dāng)前類的成員使用;b> 當(dāng)前類的對象與成員對象的聲命周期相同;c> 成員對象在用法上與普通對象完全一致。
那么繼承又是怎樣的關(guān)系呢?繼承關(guān)系通俗來講就是父子關(guān)系,如下
面向?qū)ο笾械睦^承便是指類之間的父子關(guān)系,子類擁有父類的所有屬性和行為, 子類就是這一種特殊的父類。子類對象可以當(dāng)做父類對象使用,子類中可以添加父類中沒有的方法和屬性。C++ 中通過下面的方式描述繼承關(guān)系
下來我們通過示例代碼來看看繼承
#include <iostream> #include <string> using namespace std; class Parent { int mi; public: Parent() { cout << "Parent()" << endl; mi = 100; } void method() { cout << "mi = " << mi << endl; } }; class Child : public Parent { public: void hello() { cout << "I'm Child calss!" << endl; } }; int main() { Child d; Child d1; Parent p = d1; d.hello(); d.method(); return 0; }
我們直接用類 Child 生成的對象 d 去調(diào)用類 Parent 的成員函數(shù) method,而且在第 35 行直接用對象 d1 去初始化對象 p。我們看看編譯是否會通過
我們看到?jīng)]有報錯,并且運行成功。我們之前說過子類擁有父類的一切屬性,子類對象可以當(dāng)做特殊的父類對象,所以這就不難解釋了。子類對象便可以直接使用父類中的所有資源,這便有點類似于我們在 C 語言中說的代碼復(fù)用了(其實繼承的本質(zhì)就是復(fù)用父類的代碼)。那么繼承有幾條規(guī)則:a> 子類便是一個特殊的父類;b> 子類對象是可以直接初始化父類對象的;c> 子類對象可以直接賦值給父類對象。
那么繼承的意義是什么呢?繼承是 C++ 中代碼復(fù)用的重要手段。通過繼承,可以獲得父類的所有功能,并且可以在子類中重寫已有的功能,或者添加新功能。
下來我們再通過一個示例代碼來加深下對繼承的理解
#include <iostream> #include <string> using namespace std; class Memory { public: Memory() { cout << "Memory()" << endl; } ~Memory() { cout << "~Memory()" << endl; } }; class Disk { public: Disk() { cout << "Disk()" << endl; } ~Disk() { cout << "~Disk()" << endl; } }; class CPU { public: CPU() { cout << "CPU()" << endl; } ~CPU() { cout << "~CPU()" << endl; } }; class MainBoard { public: MainBoard() { cout << "MainBoard()" << endl; } ~MainBoard() { cout << "~MainBoard()" << endl; } }; class Computer { Memory mMem; Disk mDisk; CPU mCPU; MainBoard mMainBoard; public: Computer() { cout << "Computer()" << endl; } void power() { cout << "power()" << endl; } void reset() { cout << "reset()" << endl; } ~Computer() { cout << "~Computer()" << endl; } }; class HPBook : public Computer { string mOS; public: HPBook() { mOS = "Windows 10"; } void install(string os) { mOS = os; } void OS() { cout << mOS << endl; } }; class MacBook : public Computer { public: void OS() { cout << "Mac OS" << endl; } }; int main() { HPBook hp; hp.power(); hp.install("Ubuntu 16.04"); hp.OS(); cout << endl; MacBook mac; mac.OS(); return 0; }
我們在電腦的基礎(chǔ)上新定義了 hp 和 Mac 兩種電腦。給 hp 重裝了 Ubuntu 系統(tǒng),然后打印了它的系統(tǒng)。直接打印 Mac 電腦的系統(tǒng),看看是否如我們所愿
確實是這樣的。通過對繼承的學(xué)習(xí),總結(jié)如下:1、繼承是面向?qū)ο笾蓄愔g的一種關(guān)系;2、子類擁有父類的所有屬性和行為;3、子類對象可以當(dāng)做父類對象使用;4、子類中可以添加父類中沒有的方法和屬性;5、繼承是面向?qū)ο笾写a復(fù)用的重要手段。
歡迎大家一起來學(xué)習(xí) C++ 語言,可以加我QQ:243343083。
分享名稱:繼承的意義(三十六)
文章URL:http://aaarwkj.com/article30/isjpso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、微信小程序、品牌網(wǎng)站制作、網(wǎng)站設(shè)計、虛擬主機、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)