<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
今天就以三個案例來把C++多型的內容結束。第一個案例就是用多型寫一個計算器並實現簡單的加減乘除操作;第二個案例就是一個飲品製作,主要就是抽象類重寫方法;第三個是比較綜合的電腦組裝案例,正文會詳細介紹;那麼就開始上手操作吧!
使用多型實現計算器的加減乘除操作
class AbstractCalculator { public: //純虛擬函式,用來得到計算結果 virtual void getResult() = 0; float num1, num2; }; //加法類 class Add :public AbstractCalculator { public: void getResult() { cout << num1 << "+" << num2 << "=" << num1 + num2 << endl; } }; //減法類 class Sub :public AbstractCalculator { public: void getResult() { cout << num1 << "-" << num2 << "=" << num1 - num2 << endl; } }; //乘法類 class Mul :public AbstractCalculator { public: void getResult() { cout << num1 << "*" << num2 << "=" << num1 * num2 << endl; } }; //除法類 class Des :public AbstractCalculator { public: void getResult() { cout << num1 << "/" << num2 << "=" << num1 / num2 << endl; } }; void main() { //1、加法 AbstractCalculator *abc = new Add(); abc->num1 = 2.1; abc->num2 = 3.9; abc->getResult(); delete abc; //2、減法 abc = new Sub(); abc->num1 = 3.9; abc->num2 = 2.1; abc->getResult(); delete abc; //3、乘法 abc = new Mul(); abc->num1 = 4.2; abc->num2 = 2; abc->getResult(); delete abc; //4、除法 abc = new Des(); abc->num1 = 8.8; abc->num2 = 2; abc->getResult(); delete abc; }
程式碼解釋
首先建立AbstractCalculator類作為基礎類別,設定兩個浮點型屬性用來做基本運算,並含有純虛擬函式getResult。我們知道還有純虛擬函式的類被稱為抽象類,特點是無法範例化,非抽象子類必須重寫抽象類的所有純虛擬函式,因此基本運算的類都要重寫getResult方法。接下來寫了加減乘除四個派生類繼承該抽象類,分別給派生類的getResult進行重寫,得到不同的計算結果。主函數中利用父類別指標來建立子類物件,給兩個運算元賦值後呼叫getResult方法,然後利用delete刪除指標。注意刪除指標只是刪除了那一塊地址,該指標的型別是不變的,還可以多次利用,指向不同的子類物件。
給出製作飲品的過程為四步:把水煮開、沖泡、倒入杯中、加入佐料。
利用多型寫出兩個飲品的製作過程
#include<iostream> using namespace std; //使用多型製作奶茶 class AbstractDrink { public: //製作開水 virtual void boiledWater() = 0; //沖泡 virtual void brew() = 0; //倒入杯中 virtual void inCup() = 0; //加入佐料 virtual void pour() = 0; void makeDrink() { this->boiledWater(); this->brew(); this->inCup(); this->pour(); } }; //製作咖啡 class Coffee :public AbstractDrink { public: //煮水 virtual void boiledWater() { cout << "先把水煮開" << endl; } //沖泡 virtual void brew() { cout << "開始沖泡咖啡" << endl; } //倒入杯中 virtual void inCup() { cout << "全部倒入杯中" << endl; } //加入輔料 virtual void pour() { cout << "加入糖和牛奶" << endl; cout << "牛奶咖啡製作完成" << endl; } }; //製作茶水 class Tea :public AbstractDrink { public: //煮水 virtual void boiledWater() { cout << "先把水煮開" << endl; } //沖泡 virtual void brew() { cout << "開始沖泡茶葉" << endl; } //倒入杯中 virtual void inCup() { cout << "全部倒入杯中" << endl; } //加入輔料 virtual void pour() { cout << "加入枸杞" << endl; cout << "茶水製作完成" << endl; } }; //製作函數 void DoWork(AbstractDrink* abs)//父類別指標指向子類物件AbstractDrinking* abs = new Coffee; { abs->makeDrink(); delete abs;//手動釋放 //堆區的資料被銷燬了但是指標的型別沒變,可以多次利用 } void test() { DoWork(new Coffee); cout << "---------------------" << endl; DoWork(new Tea); } void main() { test(); }
程式碼解釋
這個案例就是直接給一個類中加四個純虛擬函式,然後再加一個makeDrink方法來呼叫全部函數。子類中需要重寫四個純虛擬函式,製作咖啡和茶的類步驟基本一樣。在DoWork函數的形參列表,使用父類別的指標,那麼在test函數呼叫DoWork函數就可以直接new子類物件,這樣也是父類別指標指向子類物件,然後呼叫makeDrink方法後,用delete刪除堆區父類別指標,以免記憶體漏失。
電腦主要組成部件為 CPU(用於計算),顯示卡(用於顯示),記憶體條(用於儲存)
將每個零件封裝出抽象基礎類別,並且提供不同的廠商生產不同的零件,例如Intel廠商和Lenovo廠商
建立電腦類提供讓電腦工作的函數,並且呼叫每個零件工作的介面
測試時組裝三臺不同的電腦進行工作
class CPU { public: virtual void calculate() = 0; }; class VideoCard { public: virtual void display() = 0; }; class Storage { public: virtual void storage() = 0; }; class Computer { public: Computer(CPU* cpu, VideoCard* vc, Storage* sto) { m_cpu = cpu; m_vc = vc; m_sto = sto; } //提供一個工作的函數 void work() { m_cpu->calculate(); m_vc->display(); m_sto->storage(); } //提供解構函式釋放3個電腦零件 ~Computer() { //釋放CPU零件 if (m_cpu != NULL) { delete m_cpu; m_cpu = NULL; } //釋放顯示卡零件 if (m_vc != NULL) { delete m_vc; m_vc = NULL; } //釋放記憶體條零件指標 if (m_sto != NULL) { delete m_sto; m_sto = NULL; } } private: CPU* m_cpu;//CPU零件指標 VideoCard* m_vc;//顯示卡零件指標 Storage* m_sto;//記憶體條零件指標 }; //Intel class IntelCPU :public CPU { public: virtual void calculate() { cout << "Intel的CPU開始計算了" << endl; } }; class IntelVideoCard :public VideoCard { public: virtual void display() { cout << "Intel的顯示卡開始顯示了" << endl; } }; class IntelMemory :public Storage { public: virtual void storage() { cout << "Intel的記憶體條開始儲存了" << endl; } }; //Lenovo class LenovoCPU :public CPU { public: virtual void calculate() { cout << "Lenovo的CPU開始計算了" << endl; } }; class LenovoVideoCard :public VideoCard { public: virtual void display() { cout << "Lenovo的顯示卡開始顯示了" << endl; } }; class LenovoMemory :public Storage { public: virtual void storage() { cout << "Lenovo的記憶體條開始儲存了" << endl; } }; //組裝電腦 void test01() { //建立第一臺電腦 Computer* c1 = new Computer(new IntelCPU,new IntelVideoCard, new IntelMemory); c1->work(); delete c1; cout << "***********************" << endl; //組裝第二臺電腦 Computer* c2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory); c2->work(); delete c2; cout << "***********************" << endl; //組裝第三臺電腦 Computer* c3 = new Computer(new LenovoCPU, new IntelVideoCard, new LenovoMemory); c3->work(); delete c3; } void main() { test01(); system("pause"); }
程式碼解釋
首先把CPU,顯示卡,記憶體條做成基礎類別並各自新增純虛擬函式,強制派生類進行重寫。
然後建立Computer類,封裝三個零件類的指標,在電腦類的有參構造中傳入三個零件的指標並賦值,提供work函數呼叫各個零件的功能函數。在程式結束之前編譯器會自動呼叫解構,所以我提供一個電腦類的解構函式,釋放掉三個零件的指標。
接下來提供兩個品牌,有Intel和Lenovo兩個品牌的三種零件。對每個品牌的三個零件類進行繼承並重寫功能函數,提示具體品牌的零件做了什麼具體的功能。
最後建立三個電腦,將零件進行組裝,可以全部都是Intel也可以都是Lenovo也可以混合著組裝。利用new開闢電腦類,直接使用有參構造,將new出來的零件類傳給對應的父類別指標,完成多型的使用。電腦類建立完畢後呼叫work函數使電腦執行,隨後就將堆區指標刪除,防止記憶體洩露。
以上就是C++多型的範例詳解的詳細內容,更多關於C++多型的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45