1. 概念及定义
- 什么是多态?
同一个操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性,即采用基类的引用指向子类的对象。
多态解决了代码复用,同时解决了项目紧耦合问题,提高程序的可扩展性。应用程序不必对每一个派生类编写功能调用,只需对抽象基类及逆行处理即可,提升代码复用性。
- 虚函数
在类得定义中,前面有virtual关键字得成员函数就是 虚函数;
virtual关键字只用在类定义里得函数声明中,函数体不用;
构造函数和静态成员函数不能是虚函数。
class base {
virtual int get();
}
- 多态得表现形式一
表现一:派生类得指针可以赋给基类指针;
表现二:通过基类指针调用基类和派生类中得同名 虚函数 时:若该指针指向一个基类得对象,那么被调用是基类得虚函数;若该指针指向一个派生类得对象,那么被调用得是派生类得虚函数。
- 多态的表现形式二
派生类的对象可以赋给基类引用;
通过基类引用调用基类和派生类中的同名虚函数时:若该引用引用的是一个基类的对象,那么被调用是基类的虚函数;若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数,称为多态。
- 用基类指针数组存放指向各种派生类对象的指针,然后遍历该数组,就能对各个派生类对象做各种操作。
- 多态实现的关键 虚函数表
每一个有虚函数的类都有一个虚函数表,该类的任何对象中都放着虚函数表的指针。虚函数表中列出了该类的虚函数地址。
2. 写法
关键字
virtual
3. 程序与案例
- 案例一:多态得表现形式
class CBase {
public:
virtual void SomeVirtualFunction() {}
};
class CDerived : public CBase {
public :
virtual void SomeVirtualFunction(){} //同名虚函数
}
int main(){
CDerived ODerived;
CBase * p = & ODerived; //基类得指针指向派生类得对象
p->SomeVirtualFunction(); //调用哪个虚函数取决于p指向哪种类型得对象
return 0;
}
- 案例二
......
int main() {
......
CBase & r = ODerived;
r. =SomeVirtualFunction(); //调用哪个虚函数取决于r引用哪种类型得对象
......
}
- 案例三
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
class CShape
{
public:
virtual double Area() = 0;
virtual void PrintInfo() = 0;
};
class CRectangle : public CShape
{
public:
int w, h;
virtual double Area();
virtual void PrintInfo();
}
class CCircle : public CShape
{
public :
int r;
virtual double Area();
virtual void PrintInfo();
};
class CTriangle : public CShape
{
public :
int a, b, c;
virtual double Area();
virtual void PrintInfo();
}
...
CShape * pShapes[100]; //基类指针数组存放指向各种派生类对象的指针
int MyCompare(const void * s1, const void * s2);
int main()
{
...;
}