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

文章讲述了C++中的多态性概念,包括继承和派生导致的类层次结构,以及虚函数在实现动态绑定中的作用。通过示例解释了虚函数如何允许根据对象的实际类型调用相应的成员函数,而非静态绑定到基类的函数。同时介绍了纯虚函数,使得包含它的类成为抽象类,只能被继承而不能实例化。
摘要由CSDN通过智能技术生成

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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值