1.静态联编和动态联编
#include<iostream>
using namespace std;
class animal{
public:
virtual void speak(){//要使speak成为虚函数
cout<<"动物在说话"<<endl;
}
};
class cat:public animal{
public:
void speak(){//对父类speak进行重写
cout<<"喵喵喵"<<endl;
}
};
void dospeak(animal &a1){//这里是对父类的对象引用,但下面的cat是animal的子类,所以是父类的引用指向了子类对象,这就是多态性
a1.speak();
}
int main(){
cat c1;
dospeak(c1);//发生继承关系时,是可以运行子类型可以转换成父类型使用
animal *a1=new cat;//a1会被转换成cat类
a1->speak();//这样也可以调用cat的speak
}
2.多态性案例 计算器
#include<iostream>
using namespace std;
class Abstractcalculator{
public:
virtual double result(){//抽象类计算器
return 0;
}
double val1;
double val2;
getval(double a,double b){
val1=a;
val2=b;
}
};
class Pluscalculator:public Abstractcalculator{
public:
virtual double result(){//抽象类计算器加法功能
return val1+val2;
}
};//如果要加入新的功能只需要扩展即可不需要修改任何代码
class Divisioncalculator:public Abstractcalculator{
public:
virtual double result(){//抽象类计算器除法功能
return val1/val2;
}
};
int main(){
Abstractcalculator *a1;
a1=new Pluscalculator;
a1->getval(10,20);
cout<<a1->result()<<endl;//加法
delete a1;
a1=new Divisioncalculator;
cout<<a1->result()<<endl;//除法
}
3.通过纯虚函数和抽象类完成饮料制作流程的抽象过程
#include<iostream>
using namespace std;
class makedrink{//做饮料的抽象类,因为含有纯虚函数
public:
virtual void no1()=0;//第一步
virtual void no2()=0;//第二步
virtual void no3()=0;//第三步
virtual void no4()=0;//第四步
virtual void dowork(){
no1();
no2();
no3();
no4();
cout<<"完成制作"<<endl;
}//完成制作的流程
};
class makecoffe:public makedrink{//做咖啡
public:
virtual void no1(){//只需要对步骤虚函数重写就行
cout<<"煮水"<<endl;
}//第一步
virtual void no2(){
cout<<"冲泡咖啡"<<endl;
}//第二步
virtual void no3(){
cout<<"倒入杯中"<<endl;
}//第三步
virtual void no4(){
cout<<"加糖和牛奶"<<endl;
}//第四步
};
class makeicewater:public makedrink{//做一杯冰水
public:
virtual void no1(){//只需要对步骤虚函数重写就行
cout<<"水倒入杯中"<<endl;
}//第一步
virtual void no2(){
cout<<"加入冰块"<<endl;
}//第二步,在这里冰水已经完成,但是纯虚函数也必须要实现
virtual void no3(){
}//第三步
virtual void no4(){
}//第四步
};
//业务函数
void dowork(makedrink *m1){
m1->dowork();
delete m1;
}
int main(){
dowork(new makecoffe);
cout<<"----------------------------------------";
dowork(new makeicewater);
}