C++(23)--多态性与虚函数
多態(tài)性與虛函數(shù)
- 1.靜態(tài)多態(tài)-重載
- 2.動(dòng)態(tài)多態(tài)-重寫
- 2.1 向上轉(zhuǎn)換/向下轉(zhuǎn)換
- 3.虛函數(shù)的工作原理
- 4.純虛函數(shù)和抽象類
- 5.補(bǔ)充項(xiàng)目(都市浮生記)-卒
《老九學(xué)堂C++課程》學(xué)習(xí)筆記。《老九學(xué)堂C++課程》詳情請到B站搜索《老九零基礎(chǔ)學(xué)編程C++入門》
-------------簡單的事情重復(fù)做,重復(fù)的事情用心做,用心的事情堅(jiān)持做(老九君)---------------
多態(tài)–多種表現(xiàn)形式,生物學(xué)名詞。
同一個(gè)名稱的函數(shù),可以實(shí)現(xiàn)不同的功能。
什么是多態(tài)
面向?qū)ο缶幊痰亩鄳B(tài)性包括:
1.面向不同的對象發(fā)送同一條信息–多個(gè)對象調(diào)用同一個(gè)函數(shù)
2.不同的對象在接收時(shí)回產(chǎn)生不同的行為–
不同的行為–不同的實(shí)現(xiàn),即執(zhí)行不同的函數(shù)功能。函數(shù)名相同,但執(zhí)行的具體細(xì)節(jié)不同。
1.靜態(tài)多態(tài)-重載
靜態(tài)多態(tài)–重載
靜態(tài)多態(tài)也叫編譯時(shí)多態(tài)。
demo1.游戲引擎調(diào)用得中類對象進(jìn)行移動(dòng)操作
輸出
調(diào)用了Hero 四個(gè)參數(shù)版本的構(gòu)造 調(diào)用了Hero 一個(gè)參數(shù)版本的構(gòu)造 調(diào)用了Hero 四個(gè)參數(shù)版本的構(gòu)造 調(diào)用了Hero 四個(gè)參數(shù)版本的構(gòu)造 調(diào)用了Hero 四個(gè)參數(shù)版本的構(gòu)造 調(diào)用了Hero 四個(gè)參數(shù)版本的構(gòu)造 戰(zhàn)士《呂布1》背著一大堆近戰(zhàn)武器正在前進(jìn)。。。 戰(zhàn)士《呂布2》背著一大堆近戰(zhàn)武器正在前進(jìn)。。。 戰(zhàn)士《呂布3》背著一大堆近戰(zhàn)武器正在前進(jìn)。。。2.動(dòng)態(tài)多態(tài)-重寫
動(dòng)態(tài)多態(tài)–重寫
動(dòng)態(tài)多態(tài)也叫運(yùn)行時(shí)多態(tài),函數(shù)在執(zhí)行的過程中才能確定要執(zhí)行的是哪一個(gè)。
父類方法中加virtual關(guān)鍵字,在核心引擎類中的RoleMove參數(shù)使用hero 對象,那么可以給RoleMove傳遞各種hero子類實(shí)現(xiàn)各種移動(dòng)。
//mian.cpp #include <iostream> #include <string> #include <vector> #include "Hero.h" #include "Warrior.h" #include "Archmage.h" #include "GameCore.h" #include "Assassin.h" using namespace std; void HeroTest(); int main() {HeroTest();return 0; }void HeroTest(){Hero hero("布衣");Warrior warrior1("呂布1",50);Warrior warrior2("呂布2",50);Warrior warrior3("呂布3",50);Archmage archmage("甘道夫",80);GameCore gamecore;// 不使用virtual 關(guān)鍵字的效果// 編譯器就會根據(jù)當(dāng)前對象的類型,調(diào)用類型中定義的move 方法gamecore.MoveRole(warrior1);gamecore.MoveRole(archmage);// 使用virtual 關(guān)鍵字,派生類重寫了基類的方法//不使用virtual 輸出// 普通英雄呂布1正在奔跑在艾澤拉斯大陸上// 普通英雄甘道夫正在奔跑在艾澤拉斯大陸上//使用virtual 輸出// 戰(zhàn)士《呂布1》背著一大堆近戰(zhàn)武器正在前進(jìn)。。。// 大法師甘道夫?yàn)榱斯?jié)省魔法, 只好用雙腳趕路// 不修改核心邏輯,直接傳入新類型對象Assassin assa("飛檐走壁",100);gamecore.MoveRole(assa); }新增的刺客類
// Assassin.h // // Created by 陳瑩瑩 on 2021/3/25. //#ifndef CHAPTER14_ASSASSIN_H #define CHAPTER14_ASSASSIN_H #include <iostream> #include <string> #include "Hero.h" using namespace std; /** 體會程序是如何進(jìn)行升級的* 假定游戲需要增加一個(gè)新的職業(yè):刺客,但是核心業(yè)務(wù)類肯定不能夠隨便修改*/class Assassin:public Hero{ public:Assassin();Assassin(const string& nickName, int power):Hero(nickName),m_Power(power){}void Move() override{cout << "隱藏在黑暗中的刺客" << GetNickName() << "正在偷偷地潛入一座宮殿"<< endl;}~Assassin(); private:int m_Power;};#endif //CHAPTER14_ASSASSIN_H //Assassin.h // // Created by 陳瑩瑩 on 2021/3/25. //#include "Assassin.h"Assassin::Assassin() {} Assassin::~Assassin(){}2.1 向上轉(zhuǎn)換/向下轉(zhuǎn)換
// 為了能夠讓同一個(gè)函數(shù)操作不同類型的子類對象,所以我們把參數(shù)類型定義成基類對象// 當(dāng)傳遞Hero類型的子類型時(shí),參數(shù)類型可以自動(dòng)轉(zhuǎn)換// 關(guān)于向上和向下轉(zhuǎn)換// 當(dāng)B是A的子類型(class B: public A ),意味著所有對A對象的操作都可以對B對象進(jìn)行// 即B重用A的操作來實(shí)現(xiàn)自己的操作// 向上轉(zhuǎn)型:把子類型對象轉(zhuǎn)換為父類型對象,下面有三個(gè)注意點(diǎn):// 1.向上轉(zhuǎn)型是安全的// 2.向上轉(zhuǎn)型是自動(dòng)完成的(自動(dòng)類型轉(zhuǎn)換)// 3.向上轉(zhuǎn)型的過程中,會丟失子類型的信息。// Warrior warrior; // 子類型對象// Hero& hero = warrior; // 父類型引用指向了子類型對象--向上轉(zhuǎn)型// hero.XiaoQuanQuan(); // 編譯器會報(bào)錯(cuò)--丟失了子類型信息// 如果還想使用子類型方法,那么就需要再進(jìn)行強(qiáng)制類型轉(zhuǎn)換--向下轉(zhuǎn)型// warrior& newWarrior = (Warrior&)hero; // 向下轉(zhuǎn)型不安全// hero對象有可能是父類型的另一個(gè)子類型// Archmage warrior;// Hero& hero = warrior;// Warrior& newWarrior = (Warrior&)hero; // 編譯時(shí)不會報(bào)錯(cuò),但是執(zhí)行時(shí)會報(bào)錯(cuò),(老師演示的時(shí)候還能夠運(yùn)行的)3.虛函數(shù)的工作原理
1.構(gòu)造函數(shù)不能是虛函數(shù)
2.析構(gòu)函數(shù)應(yīng)該定義成虛函數(shù),除非該類不做基類。為了安全起見,為將類的析構(gòu)函數(shù)定義為虛函數(shù)。
3.友元函數(shù)不能是虛函數(shù)。
虛函數(shù)的工作原理:會為父類對象構(gòu)建一個(gè)隱藏成員,為指向虛函數(shù)表的指針。子類重寫了父類方法的話,也會為子類對象構(gòu)建一個(gè)隱藏成員,為指向虛函數(shù)表的指針。但是具體的函數(shù)指針變了的。
demo1:觀察虛函數(shù)列表地址的變化(實(shí)驗(yàn)現(xiàn)象沒有實(shí)現(xiàn))
4.純虛函數(shù)和抽象類
抽象類–天生的父類,實(shí)例出來沒啥用,需要進(jìn)行擴(kuò)展。(生物對象:血量,攻擊力)
語法上一個(gè)抽象類無法被實(shí)例化
抽象類的虛函數(shù)都為純虛函數(shù),純虛函數(shù)讓基類函數(shù)沒有函數(shù)體,在基類中不能被調(diào)用。純虛函數(shù)必須有派生類來實(shí)現(xiàn)純虛函數(shù)體的功能。(一個(gè)類如果有一個(gè)純虛函數(shù),那么這個(gè)類就是抽象類)
純虛函數(shù)語法格式
virtual 返回類型 函數(shù)名(參數(shù)列表) const=0;
demo:多態(tài)的方式來模擬“星際爭霸”中的指揮官和各種兵種之間的互動(dòng)關(guān)系。
指揮官發(fā)出指令–Rolling Thunder,各單位發(fā)起進(jìn)攻
5.補(bǔ)充項(xiàng)目(都市浮生記)-卒
window 編程呀,mac 的頭文件都引入不了
總結(jié)
以上是生活随笔為你收集整理的C++(23)--多态性与虚函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Socket通信 C/S模型
- 下一篇: C++(0)--mac 使用VScode