多态概念:同一种事物的多种表现形式,分为静态多态和动态多态。
一. 静态多态是编译时体现的,像函数重载,泛型编程。
函数重载:
- 作用域相同。
- 几个函数功能类似并且函数名相同。
- 参数不相同(参数类型,个数或顺序的不同)。
- 根据调用时函数的参数,知道调用哪个函数。
二. 动态多态,运行时体现的,必须满足两个条件:
- 虚函数
判断一个成员函数是不是虚函数(重写),有两个三个条件:
1). 两个成员函数各自在基类和派生类中定义;
2). 基类中定义的成员函数必须带有关键字virtual,派生类的成员函数可带可不带。
3). 这两个成员函数原型(函数名,函数参数,函数返回类型)必须相同。注意:如果这两个函数的返回类型分别为基类和派生类,返回值为指向基类和派生类的指针或引用,则也构成重写。此返回类型称为协变。
2.调用对象的虚函数时,使用对象指针或引用,这样当指针指向不同的对象时,就可以调用不同类的成员函数,从而体现多态性。
下面给一个程序分析:
#include<iostream>
using namespace std;
class Grandam
{
public:
virtual void introduce_self()
{
cout << "I am grandam." << endl;
}
};
class Mother:public Grandam
{
public:
void introdude_self()
{
cout << "I am mother." << endl;
}
};
class Daughter :public Mother
{
public:
void introduce_self()
{
cout << "I am daughter." << endl;
}
};
int main()
{
Grandam* ptr;
Grandam g;
Mother m;
Daughter d;
ptr = &g;
ptr->introduce_self();
ptr = &m;
ptr->introduce_self();
ptr = &d;
ptr->introduce_self();
return 0;
}
结果如图所示:
从结果可知,每次都执行了对象的虚函数introduce_self()版本,体现了运行时的多态。