C++面向对象笔记(5):多态篇

C++多态篇

本章主要的内容:

  1. 普通虚函数、虚析构函数。

  2. 纯虚函数(抽象类、接口类)

  3. RTTI

  4. 异常处理

  5. 隐藏VS覆盖,之间的关系

  6. 早绑定、晚绑定。

  7. 虚函数表。

1.什么是多态

  1. 多态具体到语法中是指,使用父类指针指向子类对象,并可以通过该指针调用子类的函数(方法)

  2. 产生多态的基础是继承关系,没有继承就没有多态。

  3. 多态的语法核心是virtual关键字,必须使用virtual才能使多个类间建立多态关系。(virtual是可以继承的,父类的函数(方法)写了virtual,子类同名的函数(方法)继承virtual;但是,还是推荐自己手动写上,以起到提示的作用)

  4. 封装、继承、多态是面向对象的三大特性。

1.多态分类-静态多态和动态多态(早绑定和晚绑定)

分为静态多态动态多态

1.**静态多态:**也称“早绑定”。

如下所示:

如下的调用方式(函数的重载),程序在编译阶段就知道rect.calcArea()到底要调用哪个函数了,很早的就将函数编译进去了,所以又叫早绑定。

class Rect{
   
public:
    int calcArea(int width);
    int calcArea(int width, int height);
}

int main(){
   
    Rect rect;
    rect.calcArea(10);
    rect.calcArea(10,20);
    //...
}

2.**动态多态:**也叫“晚绑定”。

对不同的对象,下达相同的指令,导致对象做着不同的操作。

例如:shape父类有Circle和Rect两个子类,利用父类的指针调用Circle和Rect中计算面积的同名函数,那么同名的函数,却能做出不同的动作,这就是动态多态。

动态多态的前提:必须以封装和继承为基础。

3.普通虚函数-实现动态多态(晚绑定)

在父类指针中调用子类的成员函数:

ShapeCircleRect父类,3个类都有calcArea(),现在想要分别调用CircleRect中的calcArea()

int main(){
   
    Shape *shape1 = new Circle(4.0);
    Shape *shape2 = new Rect(3.0,5.0);
    shape1->calcArea();
    shape2->calcArea();
    //...
}
/*输出:
Shape->calcArea()
Shape->calcArea()
*/

当运行程序时,就会发现实际上调用的都是Shape中的calcArea(),但是实际上我们想要调用的是CircleRect中的calcArea(),如果要解决当前的问题,就需要使用动态多态

实现动态多态:

我们需要使用virtual关键字,使其成为虚函数,步骤如下:

1.在父类声明中,对需要实现动态多态的函数添加virtual

class Shape{
   
public:
    virtual double calcArea(){
   	// 添加virtual
        cout << "calcArea" << endl;
        return 0;
    }
}

2.在子类声明中,对同名函数中添加virtual

系统会自动加,但是手动加上能起到提示的作用,还是建议手动添加。

class Circle : public Shape{
   
public:
    Circle(double r);
    virtual double calcArea();	// 添加virtual
private:
    double m_dR;
}

3.然后就可以使用本章最开始的代码,对子类中的函数进行调用了。

int main(){
   
    Shape *shape1 = new Circle(4.0);
    Shape *shape2 = new Rect(3.0,5.0);
    shape1->
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值