中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

一個(gè)人做商城網(wǎng)站網(wǎng)頁(yè)開發(fā)培訓(xùn)網(wǎng)

一個(gè)人做商城網(wǎng)站,網(wǎng)頁(yè)開發(fā)培訓(xùn)網(wǎng),網(wǎng)站建設(shè)html代碼如何添加,梧州百度目錄 4.7 多態(tài) 4.7.1 多態(tài)的基本概念 4.7.2 多態(tài)案例--計(jì)算器類 4.7.3 純虛函數(shù)和抽象類 4.7.4 多態(tài)案例二 - 制作飲品 4.7.5 虛析構(gòu)和純虛析構(gòu) 4.7.6 多態(tài)案例三-電腦組裝 4.7 多態(tài) 4.7.1 多態(tài)的基本概念 多態(tài)是C面向?qū)ο笕筇匦灾? 多態(tài)分為兩類 靜志多態(tài): 函數(shù)…

目錄

4.7 多態(tài)

4.7.1 多態(tài)的基本概念

?4.7.2 多態(tài)案例--計(jì)算器類

4.7.3 純虛函數(shù)和抽象類?

4.7.4 多態(tài)案例二 - 制作飲品

4.7.5 虛析構(gòu)和純虛析構(gòu)

4.7.6 多態(tài)案例三-電腦組裝?


4.7 多態(tài)

4.7.1 多態(tài)的基本概念

多態(tài)是C++面向?qū)ο笕筇匦灾?/p>

多態(tài)分為兩類

  • 靜志多態(tài): 函數(shù)重載 和 運(yùn)算符重載屬于靜態(tài)多態(tài),復(fù)用函數(shù)名
  • 動(dòng)態(tài)多態(tài): 派生類和虛函數(shù)實(shí)現(xiàn)運(yùn)行時(shí)多態(tài)

靜志多態(tài)和動(dòng)態(tài)多態(tài)區(qū)別:

  • 靜態(tài)多態(tài)的函數(shù)地址早綁定 - 編譯階段確定函數(shù)地址
  • 動(dòng)態(tài)多態(tài)的函數(shù)地址晚綁定 - 運(yùn)行階段確定函數(shù)地址

下面通過案例進(jìn)行講解多態(tài)

#include <iostream>
using namespace std;// 多態(tài)的基本概念// 動(dòng)物類
class Animal {
public:virtual void speak() {// 虛函數(shù),子類可以重寫cout << "動(dòng)物說(shuō)話" << endl;}
};// 貓類
class Cat : public Animal {
public:void speak() {cout << "貓說(shuō)話" << endl;}
};// 狗類
class Dog : public Animal {
public:void speak() {cout << "狗說(shuō)話" << endl;}
};// 動(dòng)態(tài)多態(tài)滿足條件
// 1. 有繼承關(guān)系
// 2. 父類有一個(gè)虛函數(shù)
// 3. 子類重寫了父類的虛函數(shù)// 動(dòng)態(tài)多態(tài)使用
// 父類的指針或引用指向子類的對(duì)象,調(diào)用父類的函數(shù),實(shí)際調(diào)用的是子類的函數(shù)//執(zhí)行說(shuō)話的函數(shù)
void speak(Animal& animal) {// 這里的Animal&參數(shù)表示傳入的是Animal類的引用animal.speak();// 調(diào)用Animal類的speak()函數(shù)
}void test() {Cat cat;// 實(shí)例化一個(gè)貓對(duì)象Dog dog;// 實(shí)例化一個(gè)狗對(duì)象speak(cat); // 輸出 "貓說(shuō)話"speak(dog); // 輸出 "狗說(shuō)話"
}int main() {test();return 0;
}

總結(jié):
多態(tài)滿足條件

  • 有繼承關(guān)系
  • 子類重寫父類中的虛函數(shù)

多態(tài)便用條件

  • 父類指針或引用指向子類對(duì)象

重寫:函數(shù)返回值類型 函數(shù)名 參數(shù)列表 完全一致稱為重寫

?4.7.2 多態(tài)案例--計(jì)算器類

案例描述:
分別利用普通寫法和多態(tài)技術(shù),設(shè)計(jì)實(shí)現(xiàn)兩個(gè)操作數(shù)進(jìn)行運(yùn)算的計(jì)算器類
多態(tài)的優(yōu)點(diǎn):

  • 代碼組織結(jié)構(gòu)清晰
  • 可讀性強(qiáng)
  • 利于前期和后期的擴(kuò)展以及維護(hù)

示例:

#include <iostream>
using namespace std;// 多態(tài)案例--計(jì)算器類
// 案例描述:設(shè)計(jì)一個(gè)計(jì)算器類,分別利用普通寫法和多態(tài)技術(shù),設(shè)計(jì)實(shí)現(xiàn)兩個(gè)操作數(shù)進(jìn)行運(yùn)算的計(jì)算器類// 普通寫法
class Calculator {
public:int getResult(string oper) {if (oper == "+") {return num_1 + num_2;}else if (oper == "-") {return num_1 - num_2;}else if (oper == "*") {return num_1 * num_2;}else if (oper == "/") {return num_1 / num_2;}else {cout << "Invalid operator!" << endl;return 0;}}void setNum1(int num) {num_1 = num;}void setNum2(int num) {num_2 = num;}int num_1;int num_2;
};void testCalculator() {Calculator c;c.setNum1(10);c.setNum2(5);cout << "10 + 5 = " << c.getResult("+") << endl;cout << "10 - 5 = " << c.getResult("-") << endl;cout << "10 * 5 = " << c.getResult("*") << endl;cout << "10 / 5 = " << c.getResult("/") << endl;cout << "10 % 5 = " << c.getResult("%") << endl;cout << "------------------------------------- "  << endl;
}// 利用多態(tài)實(shí)現(xiàn)計(jì)算器
// 多態(tài)好處
// 1、組織代碼更加清晰
// 2、可讀性更好
// 3、可擴(kuò)展性更強(qiáng),維護(hù)性更好// 定義計(jì)算器基類
class CalculatorBase {
public:virtual int getResult(){ return 0; }int num_1;int num_2;
};// 定義加法類
class Add : public CalculatorBase {
public:int getResult() {return num_1 + num_2;}
};// 定義減法類
class Subtract : public CalculatorBase {
public:int getResult() {return num_1 - num_2;}
};// 定義乘法類
class Multiply : public CalculatorBase {
public:int getResult() {return num_1 * num_2;}
};// 定義除法類
class Divide : public CalculatorBase {
public:int getResult() {return num_1 / num_2;}
};// 測(cè)試多態(tài)計(jì)算器
void testCalculator_2() {CalculatorBase *c1 = new Add();c1->num_1 = 10;c1->num_2 = 5;cout << "10 + 5 = " << c1->getResult() << endl;CalculatorBase *c2 = new Subtract();c2->num_1 = 10;c2->num_2 = 5;cout << "10 - 5 = " << c2->getResult() << endl;CalculatorBase *c3 = new Multiply();c3->num_1 = 10;c3->num_2 = 5;cout << "10 * 5 = " << c3->getResult() << endl;CalculatorBase *c4 = new Divide();c4->num_1 = 10;c4->num_2 = 5;cout << "10 / 5 = " << c4->getResult() << endl;delete c1;delete c2;delete c3;delete c4;
}// 程序入口
int main() {testCalculator();testCalculator_2();return 0;
}

?總結(jié):C++開發(fā)提倡利用多態(tài)設(shè)計(jì)程序架構(gòu),因?yàn)槎鄳B(tài)優(yōu)點(diǎn)很多

4.7.3 純虛函數(shù)和抽象類?

?在多態(tài)中,通常父類中虛函數(shù)的實(shí)現(xiàn)是毫無(wú)意義的,主要都是調(diào)用子類重寫的內(nèi)容
因此可以將虛函數(shù)改為純虛函數(shù)
純虛函數(shù)語(yǔ)法: virtual 返回值類型 函數(shù)名(參數(shù)列表)=0;
當(dāng)類中有了純虛函數(shù),這個(gè)類也稱為抽象類
抽象類特點(diǎn):

  • 無(wú)法實(shí)例化對(duì)象
  • 子類必須重寫抽象類中的純虛函數(shù),否則也屬于抽象類

示例:

#include <iostream>
using namespace std;// 純虛函數(shù)和抽象類class Base {
public:// 只要有一個(gè)純虛函數(shù),該類就是抽象類// 不能創(chuàng)建對(duì)象,只能作為基類被繼承// 抽象類特點(diǎn)// 1. 無(wú)法實(shí)例化對(duì)象// 2. 抽象類的子類,必須要重寫父類的純虛函數(shù),否則子類也是抽象類virtual void fun() = 0; // 純虛函數(shù)
};class Derived : public Base {
public:virtual void fun() {cout << "Derived::fun()" << endl;}
};void test() {//Base b; // 抽象類不能創(chuàng)建對(duì)象// Base b1; // 抽象類不能實(shí)例化// Base b2 = new Base; // 抽象類不能實(shí)例化Derived d;// 繼承抽象類,必須重寫父類的純虛函數(shù)d.fun();Base *base = new Derived; // 指針指向抽象類的子類對(duì)象,可以調(diào)用子類的成員函數(shù)base->fun(); // 調(diào)用子類的成員函數(shù)
}int main() {test();return 0;
}
4.7.4 多態(tài)案例二 - 制作飲品

案例描述:
制作飲品的大致流程為:煮水-沖泡-倒入杯中-加入輔料
利用多態(tài)技術(shù)實(shí)現(xiàn)本案例,提供抽象制作飲品基類,提供子類制作咖啡和茶葉

#include <iostream>
#include <string>
using namespace std;// 制作飲品的基類
class Drink {
public:virtual void BoilWater() = 0;// 燒水virtual void AddCondiments() = 0;// 添加調(diào)料virtual void PourInCup() = 0;// 把飲品倒進(jìn)杯子virtual void AddSugar() = 0;// 添加糖virtual void AddMilk() = 0;// 添加牛奶void makeDrink(){BoilWater();AddCondiments();PourInCup();AddSugar();AddMilk();}
};// 制作咖啡的子類
class Coffee : public Drink {
public:void BoilWater() {cout << "燒水" << endl;}void AddCondiments() {cout << "添加糖" << endl;}void PourInCup() {cout << "倒進(jìn)杯子" << endl;}void AddSugar() {cout << "添加糖" << endl;}void AddMilk() {cout << "添加牛奶" << endl;}
};// 制作茶的子類
class Tea : public Drink {
public:void BoilWater() {cout << "燒水" << endl;}void AddCondiments() {cout << "添加檸檬" << endl;}void PourInCup() {cout << "倒進(jìn)杯子" << endl;}void AddSugar() {cout << "添加糖" << endl;}void AddMilk() {cout << "添加牛奶" << endl;}
};// 制作飲品的函數(shù)
void makeDrinkWork(Drink* drink) {drink->makeDrink();// 調(diào)用基類的makeDrink()函數(shù)cout << "制作--完成" << endl;delete drink;// 釋放內(nèi)存
}void test() {// 制作咖啡makeDrinkWork(new Coffee());// 動(dòng)態(tài)創(chuàng)建咖啡對(duì)象并調(diào)用makeDrinkWork()函數(shù)cout << "--------------------------------" << endl;// 制作茶makeDrinkWork(new Tea());
}int main() {test();return 0;
}
4.7.5 虛析構(gòu)和純虛析構(gòu)

多態(tài)使用時(shí),如果子類中有屬性開辟到堆區(qū),那么父類指針在釋放時(shí)無(wú)法調(diào)用到子類的析構(gòu)代碼
解決方式:將父類中的析構(gòu)函數(shù)改為虛析構(gòu)或者純虛析構(gòu)
虛析構(gòu)和純虛析構(gòu)共性:

  • 可以解決父類指針釋放子類對(duì)象
  • 都需要有具體的函數(shù)實(shí)現(xiàn)

虛析構(gòu)和純虛析構(gòu)區(qū)別:

  • 如果是純虛析構(gòu),該類屬于抽象類,無(wú)法實(shí)例化對(duì)象

?虛析構(gòu)語(yǔ)法:
virtual ~類名(){}
純虛析構(gòu)語(yǔ)法:
virtual~類名()=0;
類名::~類名(){}

#include <iostream>
#include <string>
using namespace std;// 虛析構(gòu)和純虛析構(gòu)class Animal {
public:virtual void speak() = 0; // 純虛函數(shù)// 利用虛析構(gòu)函數(shù)釋放內(nèi)存,可以解決父類指針釋放子類對(duì)象時(shí)不干凈的問題//virtual ~Animal() {} // 虛析構(gòu)函數(shù),釋放內(nèi)存// 純虛析構(gòu)函數(shù),需要聲明也需要實(shí)現(xiàn)// 有了純虛析構(gòu)函數(shù),這個(gè)類也就成為了抽象類,不能實(shí)例化對(duì)象,只能作為基類被派生virtual ~Animal() = 0; // 純虛析構(gòu)函數(shù),聲明,但不定義,用于派生類中
};// 純虛析構(gòu)函數(shù),用于派生類中,聲明但不定義
Animal::~Animal(){}class Cat : public Animal {
public:Cat(string *name) {m_Name = new string(*name);}virtual void speak() {cout << "Cat: " << *m_Name << ";Meow!" << endl;}~Cat() { cout << "Cat: " << *m_Name << ";Bye!" << endl; delete m_Name; } // 虛析構(gòu)函數(shù),釋放內(nèi)存string *m_Name;
};void test_Cat() {string name = "Kitty";// 注意:這里傳遞的是指針,而不是字符串Animal* a = new Cat(&name);// 注意:這里傳遞的是指針,而不是對(duì)象a->speak();// 注意:這里調(diào)用的是虛函數(shù),而不是對(duì)象指針delete a;// 注意:這里釋放的是指針,而不是對(duì)象
}int main() {test_Cat();return 0;
}

總結(jié):
1.虛析構(gòu)或純虛析構(gòu)就是用來(lái)解決通過父類指針釋放子類對(duì)象

2.如果子類中沒有堆區(qū)數(shù)據(jù),可以不寫為虛析構(gòu)或純虛析構(gòu)

3.擁有純虛析構(gòu)函數(shù)的類也屬于抽象類?

4.7.6 多態(tài)案例三-電腦組裝?

案例描述:
電腦主要組成部件為 CPU(用于計(jì)算),顯卡(用于顯示),內(nèi)存條(用于存儲(chǔ))

將每個(gè)零件封裝出抽象其類,并且提供不同的廠商生產(chǎn)不同的零件,例如Intel廠商和Lenovo廠商創(chuàng)建電腦類提供讓電腦工作的函數(shù),并且調(diào)用每個(gè)零件工作的接口

測(cè)試時(shí)組裝三臺(tái)不同的電腦進(jìn)行工作
示例:

#include <iostream>
#include <string>
using namespace std;// CPU類
class CPU {
public:virtual void calculate() = 0;// 虛函數(shù),用于計(jì)算功能
};// 主板類
class Mainboard {
public:virtual void motherboard() = 0;// 虛函數(shù),用于組裝主板
};// 內(nèi)存條類
class Memory {
public:virtual void RAM() = 0;// 虛函數(shù),用于安裝內(nèi)存條
};// 顯卡類
class GraphicsCard {
public:virtual void display() = 0;// 虛函數(shù),用于安裝顯卡
};// 電腦類
class Computer {
public:Computer(CPU* cpu, Mainboard* mainboard, Memory* memory, GraphicsCard* graphicsCard): cpu(cpu), mainboard(mainboard), memory(memory), graphicsCard(graphicsCard) {// 構(gòu)造函數(shù),傳入各個(gè)部件對(duì)象/*cpu = cpu;mainboard = mainboard;memory = memory;graphicsCard = graphicsCard;*/}void assemble() {// 組裝電腦cpu->calculate();mainboard->motherboard();memory->RAM();graphicsCard->display();}private:CPU* cpu;// CPU對(duì)象Mainboard* mainboard;// 主板對(duì)象Memory* memory;// 內(nèi)存條對(duì)象GraphicsCard* graphicsCard;// 顯卡對(duì)象
};// 具體實(shí)現(xiàn)類
class IntelCPU : public CPU {
public:virtual void calculate() {cout << "Intel CPU is calculating..." << endl;}
};class ASUSMainboard : public Mainboard {
public:virtual void motherboard() {cout << "ASUS Mainboard is assembling..." << endl;}
};class KingstonMemory : public Memory {
public:virtual void RAM() {cout << "Kingston Memory is installing..." << endl;}
};class NvidiaGraphicsCard : public GraphicsCard {
public:virtual void display() {cout << "Nvidia GraphicsCard is installing..." << endl;}
};void test() {// 第一臺(tái)電腦零件CPU* intelCPU = new IntelCPU();Mainboard* asusMainboard = new ASUSMainboard();Memory* kingstonMemory = new KingstonMemory();GraphicsCard* nvidiaGraphicsCard = new NvidiaGraphicsCard();// 組裝電腦Computer* computer = new Computer(intelCPU, asusMainboard, kingstonMemory, nvidiaGraphicsCard);computer->assemble();// 釋放內(nèi)存delete intelCPU;delete asusMainboard;delete kingstonMemory;delete nvidiaGraphicsCard;delete computer;
}int main() {test();return 0;
}

http://www.risenshineclean.com/news/4452.html

相關(guān)文章:

  • 專業(yè)制作彩鈴網(wǎng)站排名軟件
  • 電子商務(wù)網(wǎng)站服務(wù)器百度站長(zhǎng)平臺(tái)網(wǎng)站提交
  • 做視頻播放網(wǎng)站百度問答庫(kù)
  • 為什么網(wǎng)站有不同的擴(kuò)展名全國(guó)最新的疫情數(shù)據(jù)
  • 鄒城手機(jī)網(wǎng)站建設(shè)重慶網(wǎng)
  • 煙臺(tái)網(wǎng)站排名優(yōu)化報(bào)價(jià)seo排名優(yōu)化課程
  • 購(gòu)物網(wǎng)站開發(fā)費(fèi)用武漢百度信息流廣告
  • wordpress后臺(tái)亂了是怎么回事專業(yè)網(wǎng)站優(yōu)化公司
  • 建立讀音seo研究中心vip教程
  • dw怎么做網(wǎng)站教程廣告推廣網(wǎng)站
  • seo的網(wǎng)站建設(shè)湖南企業(yè)競(jìng)價(jià)優(yōu)化公司
  • 云技術(shù)在網(wǎng)站建設(shè)中的應(yīng)用免費(fèi)網(wǎng)絡(luò)推廣軟件
  • 模板手機(jī)網(wǎng)站建設(shè)公司濟(jì)南百度推廣優(yōu)化
  • 招遠(yuǎn)建網(wǎng)站中國(guó)今天剛剛發(fā)生的新聞
  • 壽陽(yáng)網(wǎng)站建設(shè)哈爾濱網(wǎng)絡(luò)推廣優(yōu)化
  • 想要找個(gè)網(wǎng)站做環(huán)評(píng)公示剛剛中國(guó)宣布重大消息
  • 讀書網(wǎng)站如何做職業(yè)技能培訓(xùn)網(wǎng)
  • wap網(wǎng)站開發(fā) php網(wǎng)上銷售方法
  • 美妝網(wǎng)站建設(shè)環(huán)境分析人工在線客服系統(tǒng)
  • 做網(wǎng)站需要技術(shù)查詢關(guān)鍵詞排名軟件
  • 做網(wǎng)站的主機(jī)配置推銷產(chǎn)品怎么推廣
  • 海鹽市網(wǎng)站建設(shè)株洲專業(yè)seo優(yōu)化
  • 怎樣用c語(yǔ)言做網(wǎng)站北京seo推廣系統(tǒng)
  • 華為外包做的網(wǎng)站現(xiàn)在推廣引流什么平臺(tái)比較火
  • 湖北省利川市建設(shè)局網(wǎng)站企業(yè)網(wǎng)站優(yōu)化
  • 做網(wǎng)站排名工具如何讓產(chǎn)品吸引顧客
  • 可做區(qū)域代理的網(wǎng)站seo咨詢師
  • 泉州做網(wǎng)站的網(wǎng)上推廣渠道有哪些
  • 網(wǎng)絡(luò)營(yíng)銷以什么為中心官網(wǎng)seo哪家公司好
  • 可以免費(fèi)進(jìn)入的網(wǎng)站正能量域名網(wǎng)址關(guān)鍵詞查詢網(wǎng)站