多态性含义
多态指相同语法结构,代表多种功能或操作
例如:X+Y
- X和Y都为整数类型:相加操作先以个位对齐,然后对应位相加
- X和Y都为浮点类型:相加操作先以小数点对齐,然后对应位相加
- 当然
+
两边可以为不同类型也可以相加,比如虚数相加
例如:datatype max(datatype a, datatype b)
- a和b都为整数,可以直接用关系运算符判断比较得出最大值
- a和b都为日期对象,判断比较操作较为复杂
- 能否将max()函数重载,求两个新类的对象的大小
无论
X
+
Y
X+Y
X+Y还是datatype max(datatype a,datatype b)
- 都实现了一种语法格式,隐含了多种操作,这就是多态
- 多态实现了“一种接口,多种方法”
- 具体地讲就是将运算符重载,将函数重载,实现不同功能
多态性的两种形式
编译时多态性
- 编译器对源程序进行编译时就可以确定所调用的是哪一个函数
- 编译时多态性通过重载来实现
- 函数重载
- 运算符重载
运行时多态性
- 在程序运行过程中根据具体情况来确定调用的是哪一个函数
- 运行时多态通过虚函数来实现
编译时多态
兔子类
class 兔子
{
public:
void 逃生(老鹰 a){"兔子蹬鹰";}
void 逃生(老狼 b){"动如脱兔";}
};
void main()
{
兔子 rabbit;
老鹰 eagle;
老狼 wolf;
rabbit.逃生(eagle);
rabbit.逃生(wolf);
}
逃生函数是重载函数,相同函数名
在调用函数时,传入的参数类型在编译时就确定
最大类
#include<iostream>
using namespace std;
char max_( char x, char y ) { return x>y ? x : y; }
int max_( int x, int y ) { return x>y ? x : y; }
float max_( float x, float y ) {return x>y ? x : y; }
void main()
{
float a=3.14, b=2.718;
cout << "d与s:" << max_('d', 's') << "大" << endl; // 字符类比较
cout << "28与168:" << max_(28, 168) << "大" << endl; // 整数类比较
cout << "3.14与2.718:" << max_(a, b) << "大" << endl; // 浮点数比较
}
运行时多态
#include<iostream>
using namespace std;
class pet
{
public:
virtual void speak() {cout<<"zzz"<<endl;};
};
class cat : public pet
{
public:
void speak() { cout<< "miao!miao!"<<endl; }
};
class dog : public pet
{
public:
void speak() { cout<< "wang!wang!"<<endl; }
};
void main()
{
pet pet1, *p=&pet1; //p为宠物类指针
cat cat1; //定义猫类对象
dog dog1; //定义狗类对象
int x; //根据用户输入将猫或狗对象地址赋给p指针,
cin >> x; //石头扔的远近,只有扔了才知道效果
if(x==1) p = &cat1; //例如用户输入1 ,则执行猫对象地址赋给p
if(x==2) p = &dog1; //例如用户输入2,则执行猫对象地址赋给p
p->speak(); //究竟运行哪个函数,只有运行时才知道
}
注意: 0的时候 就输入基类中的成员函数
其中基类中pet
中有一个关键字virtual
,表明是虚函数
有virtual修饰的函数,在基类指针指向派生类对象或者基类引用以派生类对象赋值时调用派生类的函数,无virtual修饰时只会调用基类的函数
一个类中将所有的成员函数都尽可能地设置为虚函数总是有益的。下面是设置虚函数的注意事项:
1.只有类的成员函数才能声明为虚函数
2.静态成员函数不能使虚函数,因为它不受限于某个对象
3.内联函数不能使虚函数
4.构造函数不能是虚函数