1.多态定义
多态:多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。比如,你和你朋友同时继承了人这个类中打人的方法,但是你用拳头打人和你朋友用巴掌打人的方法都是打人方法,却表现出不同的形式,这就是现实生活中多态的理解。
2.多态的应用
具体的应用就是通过基类指针来调用派生类里面的虚函数,从而实现这些虚函数各自不一样功能;
3.虚函数
格式:virtual 返回类型 函数名(参数){…}
注意:所有基类的派生类的虚函数必须函数名相同,函数类型相同,参数类型相同,参数个数相同,参数顺序相同
4.实现多态应用的要求和前提
1.设置虚函数,且所有的虚函数(基类里的和派生类里的)函数类型和名字必须一致
2.所有派生类的继承方式采用公有继承
3.设置基类类型的指针,将派生类对象的地址赋给该指针,然后再将指针指向虚函数,就可以调用该派生类里的虚函数,实现该派生类里虚函数的作用
5.示例代码
派生类B,C都继承了基类A里的虚函数who()(打人的方法),但在各自的派生类中实现形式不同(用拳头打人和用巴掌打人…),在通过基类的的指针即可调用不同功能的虚函数
#include<iostream>
using namespace std;
class A
{
private:
char x;
public:
A(char xx):x(xx){};
virtual void who(){cout<<"it's performance A class"<<endl;}
};
class B:public A
{
private:
char y;
public:
B(char xx,char yy):A(xx){y=yy;}
virtual void who(){cout<<"it's performance B class"<<endl;}
};
class C:public A
{
private:
char z;
public:
C(char xx,char zz):A(xx){z=zz;}
virtual void who(){cout<<"it's performance C class"<<endl;}
};
int main()
{
A a('A');
B b('T','O');
C c('N','D');
A *p;
p=&a;p->who();
p=&b;p->who();
p=&c;p->who();
return 0;
}
演示结果:
6.虚函数和基类指针的注意事项
1.派生类的继承方式必须是公有继承
2.必须首先在基类中定义虚函数
3.基类中虚函数头部前加上关键字virtual后,其派生类中的虚函数头部前可以不加关键字virtual(建议加上)
4.一般通过基类指针访问虚函数时才能体现多态性
5.一个虚函数无论被继承多少次,都可以保持其虚函数的特性
6.虚函数必须是其所在类的成员函数或是析构函数,不能是友元函数,不能是静态函数,不能是构造函数,也不能是内联成员函数
7.虚函数例题
演讲前先抓阄(输入一个字符),抓到s则妹妹发言,抓到b则哥哥发言,用虚函数和多态来实现
#include<iostream>
using namespace std;
class Li//李氏家族做基类
{
public:
virtual void say() {};
};
class Li_brother : public Li
{
public:
virtual void say()
{
cout<<"I'm Li ming(哥哥), I have three sports: boxing, fencing and wrestling."<<endl;
}
};
class Li_sister : public Li{
public:
virtual void say()
{
cout<<"I'm Li xia(妹妹), I have two sports: swim and skating."<<endl;
}
};
void Speak(Li *pL) { pL->say(); }
int main(){
Li *p; //基类指针,李家代表
Li_brother b;
Li_sister s;
char select; cin>>select;
if(select =='s') p = &s; //基类指针指向派生类Li_sister对象,妹妹获得发言机会
if(select =='b') p = &b; //基类指针指向派生类Li_brother对象,哥哥获得发言机会
Speak(p);
return 0;
}
演示结果:
8.纯虚函数
在许多情况下,基类中不能对虚函数给出有意义的实现(有意义的函数体),这是要么写成空的函数体(例如例题里基类Li里的虚函数say()),要么写成虚函数,它的实现留给基类的派生类去做,这就是虚函数的作用;
格式:virtual 返回类型 函数名(参数)=0;
9.抽象类
定义:具有纯虚函数的类称为抽象类
注意:抽象类不允许有对象,但可以有指针(抽象类类型的指针)和引用
10.纯虚函数例题
题目:利用纯虚函数计算圆的面积,三角形的面积,长方形或正方形的面积
#include<iostream>
using namespace std;
class figure
{
protected :
double x,y;
public:
void set_dim(double i, double j=0) { x = i ; y = j ; }
virtual void show_area() = 0 ;//纯虚函数
};
class triangle : public figure//三角形
{
public :
void show_area()
{ cout<<"Triangle with high "<<x<<" and base "<<y <<" has an area of "<<x*0.5*y<<"\n"; }
};
class square : public figure//长方形或正方形
{
public:
void show_area()
{ cout<<"Square with dimension "<<x<<"*"<<y <<" has an area of "<<x*y<<"\n"; }
};
class circle : public figure//圆
{
public:
void show_area()
{ cout<<"Circle with radius "<<x; cout<<" has an area of "<<3.14*x*x<<"\n"; }
};
int main()
{
figure *p; // 声明抽象类指针
triangle t; square s; circle c;
p=&t;
p->set_dim(10.0,5.0); // 计算三角形面积
p->show_area();
p=&s;
p->set_dim(10.0,5.0); // 计算长方形或正方形面积
p->show_area();
p=&c;
p->set_dim(9.0); // 计算圆形的面积
p->show_area();
return 0;
}
演示结果:
11.纯虚函数注意
1.纯虚函数只在基类中,所以抽象类都是基类
2.具有多态操作能力的有:基类指针指向派生类对象,抽象类类型的指针,抽象类类型的引用