文章目錄
- 一、多態
- (一)概念
- 1. 多態
- 2. 函數重寫
- 3. 虛函數
- (二)實現多態的條件
- 1. 繼承關系
- 2. 父類中寫虛函數
- 3. 在子類中重寫父類的虛函數
- 4.父類的指針或引用指向子類的對象
- 5. 使用示例
- (三)虛析構函數
- (四)純虛函數和抽象類
一、多態
(一)概念
1. 多態
多態是泛型編程的一種。
泛型編程是一種程序設計風格,它允許程序員在編寫代碼時使用以后才指定的類型,通過這種方式,可以編寫出適用于多種數據類型的通用代碼,從而提高代碼的復用性和效率。
多態:通過調用一個公共成員函數產生不同的形態;
分類:
靜態多態:在編譯階段就確定地址。如:函數重載,運算符重載
動態多態:在運行階段確定地址
2. 函數重寫
函數重寫:在子類中重寫父類的相同的函數,稱之為函數重寫。
函數重載:相同的作用域,相同的函數名,不同的形參表構成函數重載
函數重寫:相同的函數名,相同的參數,相同的返回值,函數體可以不同。
- 注:函數重寫必須發生在基類和派生類之間;
3. 虛函數
C++在聲明和定義函數的時候,在前面加上vittual關鍵字,就稱為虛函數
(二)實現多態的條件
1. 繼承關系
2. 父類中寫虛函數
3. 在子類中重寫父類的虛函數
在子類中重寫父類的虛函數時,不加virtual關鍵字也是在重新虛函數;
也可以加上virtual,但是一般不加。
4.父類的指針或引用指向子類的對象
5. 使用示例
#include <iostream>
#include <string>using namespace std;class Hero{
protected:string name;int life=100;
public:Hero(){}Hero(string n,int l):name(n),life(l){}~Hero(){}virtual void reduce_life(){life--;}int get_life(){return life;}
};class Master:public Hero{
private:string skill;
public:Master():Hero(){}Master(string n,int l,string s):Hero(n,l),skill(s){}~Master(){}void reduce_life(){life-=500;}
};class Shooter:public Hero{
private:int attack;
public:Shooter():Hero(){}Shooter(string n,int l,int a):Hero(n,l),attack(a){}~Shooter(){}void reduce_life(){life-=300;}
};//全局函數
void fight_wild(Hero &h){ //相當于父類的引用指向了子類的對象h.reduce_life();
}int main()
{Master m("妲己",4000,"愛心攻擊");Shooter s("魯班七號",4500,300);fight_wild(m);fight_wild(s);cout<<"m.life="<<m.get_life()<<endl;cout<<"s.life="<<s.get_life()<<endl;return 0;
}
(三)虛析構函數
構造函數、拷貝構造函數和拷貝賦值函數不能實現虛函數
析構函數可以實現虛函數
(四)純虛函數和抽象類
只有函數的聲明,沒有函數的定義的虛函數稱之為純虛函數。
純虛函數的語法格式:
virtual void show(){}
virtual void show()=0;//花括號和函數體換成=0
- 注:
- 如果寫成純虛函數就必須在子類中進行重寫父類的虛函數
- 如果類中有純虛函數則這個類稱之為抽象類
- 如果類中的成員函數全部都是純虛函數則這個類稱之為純抽象類
#include <iostream>
#include <string>using namespace std;class Drink{
protected:
public:virtual void Boil()=0;virtual void Brew()=0;virtual void PourIncup()=0;virtual void PutSomthing()=0;void Drink_make(){Boil();Brew();PourIncup();PutSomthing();}
};class Coffee:public Drink{
private:
public:void Boil(){cout<<"燒水"<<endl;}void Brew(){cout<<"沖泡咖啡"<<endl;}void PourIncup(){cout<<"倒入杯中"<<endl;}void PutSomthing(){cout<<"加糖和牛奶"<<endl;}
};class Tea:public Drink{
private:
public:void Boil(){cout<<"燒水"<<endl;}void Brew(){cout<<"沖泡茶葉"<<endl;}void PourIncup(){cout<<"倒入杯中"<<endl;}void PutSomthing(){cout<<"加珍珠和奶"<<endl;}
};int main()
{Coffee c;Tea t;c.Drink_make();cout<<"**********"<<endl;t.Drink_make();return 0;
}