zoukankan      html  css  js  c++  java
  • C++抽象类和纯虚函数

    抽象类不能够创建对象实例

    在继承关系中,从基类到派生类,其实是一个由抽象到具体的过程——派生类相对于其基类更加具体,而基类相对于派生类更加抽象。拿我们之前的例子来说:几何图像是一个抽象的概念,它可以具体的表现为圆、矩形、三角形等具体的几何图形。那么我们就可以说几何图形是一个抽象类。

    在C++中,如果一个类中有纯虚函数,那么它就是一个抽象类。纯虚函数和虚函数的目的就是为了提供一个统一的接口,而不同之处在:纯虚函数不能实现,只能在子类中重载(有点像Java中接口Interface的概念),这样做是为了防止基类(抽象类)实例化。

    上面是用自然语言描述的抽象类,那么用程序语言如何表示抽象类呢?

    在Java中抽象类需要使用abstract关键字,但是C++中没有关键字abstract。

    纯虚函数和虚函数很像,也需要关键字virtual,但是要在函数的最后加" = 0",如下所示:

    //获取面积
    virtual double getArea() = 0;

    之前我们说过,由于我们不知道一个几何图形具体是什么,所以也无法实现GeomtricObject类的getArea方法(每种几何图形计算面积的公式都不同),也就是说getArea这个函数不能再基类中实现,而需要在子类中实现。那么你可能要问了,既然要在子类中实现,为什么还要在基类中写一个纯虚函数呢?

    因为我们的类表示的是一个抽象的集合,我们要把它所表示的事物的属性动作表示出来。一个几何图形必然是有面积的,既然有面积,那么我们就需要有一个方法来获取它。哪怕这个方法不能在基类中实现,我们也应该写出来。

    不仅如此,抽象类相当于一个接口。如果我们是在多人协作开发,一位同事要查看并使用你的GeomtricObject类,如果你写了getArea纯虚函数,那么他就会知道:有这样一个方法可以让GeomtricObject的派生类得到对象实例的面积;但假如不写这个函数,他就完全不知道有这样一种方法,也就无法使用,又或者他需要阅读基类和所有派生类的代码,才能够知道如何获取面积。

  • 相关阅读:
    STR[#6]
    整数
    一些应该记住的东西(持续更新?再也不会更新了)
    退役后的续命杂谈
    51Nod 快速傅里叶变换题集选刷
    支配树学习笔记
    动态点分治入门随讲
    KD树小结
    HNOI2013 BZOJ3142 数列
    BZOJ2001 HNOI2010 城市建设
  • 原文地址:https://www.cnblogs.com/bwjblogs/p/12797243.html
Copyright © 2011-2022 走看看