多态包含静态与动态两种,静态指编译时多态,动态指运行时多态
编译时多态:在c++中主要体现在函数模板中
函数重载与编译时多态无关。多态举例:
template<typename T>
T add(T x,T y){
T c=x+y;
return c;
}
运行时多态:主要体现在虚函数中
子类覆盖或者改写父类中的成员函数。如:
#include <iostream>
using namespace std;
class A{
public:
void f1()
{
cout<<"A::f1()"<<endl;
}
virtual void f2()
{
cout<<"A::f2()"<<endl;
}
};
class B:public A
{
public:
//覆盖
void f1()
{
cout<<"B::f1()"<<endl;
}
//重写
virtual void f2()
{
cout<<"B::f2()"<<endl;
}
};
int main()
{
A* p = new B();
B* q = new B();
p->f1(); //调用A::f1()
p->f2(); //调用B::f2(),体现多态性
q->f1(); //调用B::f1()
q->f2(); //调用B::f2()
return 0;
}
纯虚函数:
virtual void f3()=0;
纯虚函数可以在类外定义函数体
为什么要有纯虚函数:
- 虚函数可以满足多态性
- 有些类不适合生成对象,如动物。将函数定义为纯虚函数,要求想要生成对象的类必须重写该函数。
- 含有纯虚函数的类叫抽象(基)类,无法生成对象也不会被调用,主要用来统一管理子类对象