文章目录
- 一、多态
- (一)概念
- 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;
}