Fork me on Github Fork me on Gitee

C++温故补缺(九):C++多态

C++多态

继承和派生

当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态

如:shape类被派生为两个类:Rectangle和Triangle

#include<iostream>
using namespace std;

class Shape{
    protected:
        int width,height;
    public:
        Shape(int a=0,int b=0){width=a;height=b;}
        int area(){
            cout<<"parent class area";
            return 0;
        }
};

class Rectangle:public Shape{
    public:
        Rectangle(int a=0,int b=0):Shape(a,b){}
        int area(){
            return width*height;
        }
};
class Triangle:public Shape{
    public:
        Triangle(int a=0,int b=0):Shape(a,b){}
        int area(){
            return width*height/2;
        }
};
int main(){
    Rectangle rec(10,7);
    Triangle tri(10,5);
    cout<<tri.area()<<endl;
    cout<<rec.area()<<endl;
}

虚函数

虚函数是在基类中用关键字virtual声明的函数,在派生类中重新定义基类中定义过的虚函数时,会告诉编译器不要静态链接到该函数

如:上面的例子

int main(){
    Shape *shape;
    Rectangle rec(10,7);
    Triangle tri(10,5);
    shape=&rec;
    cout<<shape->area()<<endl;
    shape=&tri;
    cout<<shape->area()<<endl;
}

输出

并不是想象中的两个面积,这是因为调用shape->area()是基类中的area()函数,这就是静态多态静态链接,函数调用在程序执行前就准备好了,也被称为早绑定,要解决这个问题,可以使用virtual修饰基类中的area()函数。

class Shape{
    protected:
        int width,height;
    public:
        Shape(int a=0,int b=0){width=a;height=b;}
        virtual int area(){
            cout<<"parent class area";
            return 0;
        }
};

输出

这样程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接

纯虚函数

如果定义虚函数=0,如virtual int area()=0;

那么这个函数就是一个纯虚函数,纯虚函数所在的类,只能被继承,不能用于实例化,类似java中的抽象类

如:

#include<iostream>
using namespace std;

class Shape{
    protected:
        int width,height;
    public:
        Shape(int a=0,int b=0){width=a;height=b;}
        virtual int area()=0;
};

class Rectangle:public Shape{
    public:
        Rectangle(int a=0,int b=0):Shape(a,b){}
        int area(){
            return width*height;
        }
};

int main(){
    Rectangle rec(10,2);
    cout<<rec.area();
}
posted @ 2023-03-20 23:19  Tenerome  阅读(22)  评论(0编辑  收藏  举报