C++多態(tài)的示例詳解
今天就以三個(gè)案例來(lái)把C++多態(tài)的內(nèi)容結(jié)束。第一個(gè)案例就是用多態(tài)寫一個(gè)計(jì)算器并實(shí)現(xiàn)簡(jiǎn)單的加減乘除操作;第二個(gè)案例就是一個(gè)飲品制作,主要就是抽象類重寫方法;第三個(gè)是比較綜合的電腦組裝案例,正文會(huì)詳細(xì)介紹;那么就開始上手操作吧!
案例一:計(jì)算器
案例要求
使用多態(tài)實(shí)現(xiàn)計(jì)算器的加減乘除操作
代碼實(shí)現(xiàn)
class AbstractCalculator
{
public:
//純虛函數(shù),用來(lái)得到計(jì)算結(jié)果
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;
}
代碼解釋
首先創(chuàng)建AbstractCalculator類作為基類,設(shè)置兩個(gè)浮點(diǎn)型屬性用來(lái)做基本運(yùn)算,并含有純虛函數(shù)getResult。我們知道還有純虛函數(shù)的類被稱為抽象類,特點(diǎn)是無(wú)法實(shí)例化,非抽象子類必須重寫抽象類的所有純虛函數(shù),因此基本運(yùn)算的類都要重寫getResult方法。接下來(lái)寫了加減乘除四個(gè)派生類繼承該抽象類,分別給派生類的getResult進(jìn)行重寫,得到不同的計(jì)算結(jié)果。主函數(shù)中利用父類指針來(lái)創(chuàng)建子類對(duì)象,給兩個(gè)操作數(shù)賦值后調(diào)用getResult方法,然后利用delete刪除指針。注意刪除指針只是刪除了那一塊地址,該指針的類型是不變的,還可以多次利用,指向不同的子類對(duì)象。
運(yùn)行效果

案例二:制作飲品
案例要求
給出制作飲品的過(guò)程為四步:把水煮開、沖泡、倒入杯中、加入佐料。
利用多態(tài)寫出兩個(gè)飲品的制作過(guò)程
代碼實(shí)現(xiàn)
#include<iostream>
using namespace std;
//使用多態(tài)制作奶茶
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;
}
};
//制作函數(shù)
void DoWork(AbstractDrink* abs)//父類指針指向子類對(duì)象AbstractDrinking* abs = new Coffee;
{
abs->makeDrink();
delete abs;//手動(dòng)釋放
//堆區(qū)的數(shù)據(jù)被銷毀了但是指針的類型沒變,可以多次利用
}
void test()
{
DoWork(new Coffee);
cout << "---------------------" << endl;
DoWork(new Tea);
}
void main()
{
test();
}
代碼解釋
這個(gè)案例就是直接給一個(gè)類中加四個(gè)純虛函數(shù),然后再加一個(gè)makeDrink方法來(lái)調(diào)用全部函數(shù)。子類中需要重寫四個(gè)純虛函數(shù),制作咖啡和茶的類步驟基本一樣。在DoWork函數(shù)的形參列表,使用父類的指針,那么在test函數(shù)調(diào)用DoWork函數(shù)就可以直接new子類對(duì)象,這樣也是父類指針指向子類對(duì)象,然后調(diào)用makeDrink方法后,用delete刪除堆區(qū)父類指針,以免內(nèi)存泄漏。
運(yùn)行效果

案例三:電腦組裝
案例要求
電腦主要組成部件為 CPU(用于計(jì)算),顯卡(用于顯示),內(nèi)存條(用于存儲(chǔ))
將每個(gè)零件封裝出抽象基類,并且提供不同的廠商生產(chǎn)不同的零件,例如Intel廠商和Lenovo廠商
創(chuàng)建電腦類提供讓電腦工作的函數(shù),并且調(diào)用每個(gè)零件工作的接口
測(cè)試時(shí)組裝三臺(tái)不同的電腦進(jìn)行工作
代碼實(shí)現(xiàn)
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;
}
//提供一個(gè)工作的函數(shù)
void work()
{
m_cpu->calculate();
m_vc->display();
m_sto->storage();
}
//提供析構(gòu)函數(shù)釋放3個(gè)電腦零件
~Computer()
{
//釋放CPU零件
if (m_cpu != NULL)
{
delete m_cpu;
m_cpu = NULL;
}
//釋放顯卡零件
if (m_vc != NULL)
{
delete m_vc;
m_vc = NULL;
}
//釋放內(nèi)存條零件指針
if (m_sto != NULL)
{
delete m_sto;
m_sto = NULL;
}
}
private:
CPU* m_cpu;//CPU零件指針
VideoCard* m_vc;//顯卡零件指針
Storage* m_sto;//內(nèi)存條零件指針
};
//Intel
class IntelCPU :public CPU
{
public:
virtual void calculate()
{
cout << "Intel的CPU開始計(jì)算了" << endl;
}
};
class IntelVideoCard :public VideoCard
{
public:
virtual void display()
{
cout << "Intel的顯卡開始顯示了" << endl;
}
};
class IntelMemory :public Storage
{
public:
virtual void storage()
{
cout << "Intel的內(nèi)存條開始存儲(chǔ)了" << endl;
}
};
//Lenovo
class LenovoCPU :public CPU
{
public:
virtual void calculate()
{
cout << "Lenovo的CPU開始計(jì)算了" << endl;
}
};
class LenovoVideoCard :public VideoCard
{
public:
virtual void display()
{
cout << "Lenovo的顯卡開始顯示了" << endl;
}
};
class LenovoMemory :public Storage
{
public:
virtual void storage()
{
cout << "Lenovo的內(nèi)存條開始存儲(chǔ)了" << endl;
}
};
//組裝電腦
void test01()
{
//創(chuàng)建第一臺(tái)電腦
Computer* c1 = new Computer(new IntelCPU,new IntelVideoCard, new IntelMemory);
c1->work();
delete c1;
cout << "***********************" << endl;
//組裝第二臺(tái)電腦
Computer* c2 = new Computer(new LenovoCPU, new LenovoVideoCard, new LenovoMemory);
c2->work();
delete c2;
cout << "***********************" << endl;
//組裝第三臺(tái)電腦
Computer* c3 = new Computer(new LenovoCPU, new IntelVideoCard, new LenovoMemory);
c3->work();
delete c3;
}
void main()
{
test01();
system("pause");
}
代碼解釋
首先把CPU,顯卡,內(nèi)存條做成基類并各自添加純虛函數(shù),強(qiáng)制派生類進(jìn)行重寫。
然后創(chuàng)建Computer類,封裝三個(gè)零件類的指針,在電腦類的有參構(gòu)造中傳入三個(gè)零件的指針并賦值,提供work函數(shù)調(diào)用各個(gè)零件的功能函數(shù)。在程序結(jié)束之前編譯器會(huì)自動(dòng)調(diào)用析構(gòu),所以我提供一個(gè)電腦類的析構(gòu)函數(shù),釋放掉三個(gè)零件的指針。
接下來(lái)提供兩個(gè)品牌,有Intel和Lenovo兩個(gè)品牌的三種零件。對(duì)每個(gè)品牌的三個(gè)零件類進(jìn)行繼承并重寫功能函數(shù),提示具體品牌的零件做了什么具體的功能。
最后創(chuàng)建三個(gè)電腦,將零件進(jìn)行組裝,可以全部都是Intel也可以都是Lenovo也可以混合著組裝。利用new開辟電腦類,直接使用有參構(gòu)造,將new出來(lái)的零件類傳給對(duì)應(yīng)的父類指針,完成多態(tài)的使用。電腦類創(chuàng)建完畢后調(diào)用work函數(shù)使電腦運(yùn)行,隨后就將堆區(qū)指針刪除,防止內(nèi)存泄露。
運(yùn)行效果

以上就是C++多態(tài)的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于C++多態(tài)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Matlab實(shí)現(xiàn)二維散點(diǎn)主方向直方圖的繪制詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Matlab實(shí)現(xiàn)二維散點(diǎn)主方向直方圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定幫助,需要的可以參考一下2022-09-09
VSCODE+cmake配置C++開發(fā)環(huán)境的實(shí)現(xiàn)步驟
這篇文章主要介紹了VSCODE+cmake配置C++開發(fā)環(huán)境的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
C語(yǔ)言字符串轉(zhuǎn)換為Python字符串的方法
這篇文章主要介紹了C語(yǔ)言字符串轉(zhuǎn)換為Python字符串的方法,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
C/C++通過(guò)SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查操作
SQLite,作為一款嵌入式關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),一直以其輕量級(jí)、零配置以及跨平臺(tái)等特性而備受青睞,本文主要介紹了C++如何通過(guò)SQLite SDK實(shí)現(xiàn)數(shù)據(jù)庫(kù)增刪改查操作,感興趣的可以了解下2023-11-11
C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之串插入操作
這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之串插入操作的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-10-10

