多态可分为静态多态动态多态

  • 静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,比如函数的重载
  • 动态多态则是利用虚函数实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数的栈帧。

虚函数:

在基类中声明该函数是虚拟的(在函数之前加virtual关键字),然后在子类中正式的定义(子类中的该函数的函数名,返回值,函数参数个数,参数类型,全都与基类的所声明的虚函数相同,此时才能称为重写,才符合虚函数,否则就是函数的重载),再定义一个指向基类对象的指针,然后使该指针指向由该基类派生的子类对象,再然后用这个指针来调用改虚函数,就能实现动态多态。


下面以"计算器"举例说明:

  • 不使用多态的版本如下:
class Caculator
{
public:
    int getResult(char fun){
        if(fun == '+') return a+b;
        else if(fun == '-') return a-b;
        else if(fun == '*') return a*b;
        //增加计算方式时  需要手动增删源代码 
    }
    
    int a;
    int b;
};

int main()
{
    char fun;
    Caculator x;
    x.a=5;
    x.b=10;
    cin >> fun;
    cout << x.getResult(fun);
    
} 
  • 使用多态的版本如下:
class Caculator//父类计算器 
{
public:
    virtual int getResult(){
        return 0;
    }
    
    int a;
    int b;
};

//子类:加法器
class Add : public Caculator{
public:
    int getResult(){
        return a+b;
    }
};
//此处省略减法器、乘法器等。
int main(){
    Caculator* c = new Add;
    c->a=1;
    c->b=2;
    cout << c->getResult() << endl;
return 0;
} 

可以见得,使用多态的优点有
1.组织结构清晰
2.可读性强
3.易于扩展,可维护性高 (tips:在实际开发中,提倡扩展而不提倡修改,也正是多态的优势所在)



在多态中,父类中的虚函数实现是毫无意义的,主要都由子类编写对应函数。
所以可以将父类中的虚函数编写为纯虚函数。

纯虚函数

  • 意义:告诉用户这个函数是没有实际意义的。
  • 用法:在函数体的位置书写=0; 例如:
class A{
public:
...
    virtual void function(){
    ...}
}

抽象基类

  • 定义:含有纯虚函数的类是抽象基类。
  • 解释:①抽象基类负责定义接口,而后续的其他类可以覆盖该接口。②我们不能直接创建一个抽象基类的对象(即不能实例化),并且抽象基类的派生类中必须对抽象基类中的纯虚函数进行重写。

Oliver
76 声望13 粉丝

Slow Done, Achieve More.