5. C++ 抽象类

1 简介

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类, 它不能生成对象 ;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。
抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。----百度百科

抽象类的主要作用是对多个子类相同部分抽象为一个基类,其中相同的方法或数据在基类定义,如需更改的方法可在基类声明为纯虚函数,子类可自定义纯虚函数功能。可理解为基类定义了类方法规范,具体功能由子类实现。

2 纯虚函数

虚函数在《C++多态》已经介绍过。纯虚函数与虚函数的区别在于:纯虚函数没有实际的实现,其只能通过子类实现具体的功能。
格式:

virtual <类型><函数名>(<参数表>)=0;
E.g: virtual void show()=0;

需要注意的是:

  • 只要包含纯虚函数的基类都称为抽象类,抽象类不可用于直接实例化对象。
  • 子类必须要实现父类的纯虚函数,负责会报错。

3 实例

Eg.实现正方形与圆形的面积计算。(多态的例子重新拿来使用)

#include<iostream>

using namespace std;
const double PI = 3.14;  

//基类
class Shape
{
public:
    virtual void show() = 0;    //显示各类基本元素 (纯虚函数)
    virtual void showArea() = 0;  //显示面积 (纯虚函数)
    virtual void Caculate() = 0;  //面积算法 (纯虚函数)
    ~Shape(){ }
};
//正方形
class Square : public Shape
{
public:
    Square()
    {
        Lenth = 0;
        Width = 0;
    }
    Square(double lenth, double width)
    {
        Lenth = lenth;
        Width = width;
    }
    virtual void show()
    {
        cout << "Lenth:" << Lenth << " Width" << Width << endl;
    }
    virtual void showArea()
    {
        cout << "SquareArea:" << SquareArea << endl;
    }
    virtual void Caculate()
    {
        SquareArea = Lenth * Width;
    }
private:
    double Lenth;
    double Width;
    double SquareArea;
};

//圆形
class Circle : public Shape
{
public:
    Circle(){ Radius = 0; }
    Circle(double radius)
    {
        Radius = radius;
    }
    virtual void show()
    {
        cout << "半径:" << Radius << endl;
    }
    virtual void showArea()
    {
        cout << "CircleArea" << CircleArea << endl;
    }
    virtual void Caculate()
    {
        CircleArea = PI * Radius * Radius;
    }
private:
    double Radius;
    double CircleArea;
};


void print(Shape& sp)
{
    sp.Caculate();
    sp.show();
    sp.showArea();
}


int main()
{
    Square sq1(5, 4);
    Circle cr1(7);
    Square sq2;
    print(sq1);
    print(cr1);
    print(sq2);

    return 0;
}

结果输出:

Lenth:5 Width4
SquareArea:20
半径:7
CircleArea153.86
Lenth:0 Width0
SquareArea:0

4 总结

本篇文章主要记录抽象类的概念及具体展现实例,抽象类的作用更类似于对方法接口的规范,即在抽象类中声明需要用到的方法名为纯虚函数,子类编程中就无须重新定义方法名,只需要实现抽象类的纯虚函数即可。
根据本篇内容,总结一下使用抽象类的注意事项:

  • 包函数纯虚函数的类都称为抽象类。
  • 抽象类不可用于直接定义对象,只能在由实现了纯虚函数的子类定义对象。
  • 继承于抽象类的子类,必须实现抽象类中的纯虚函数。

如需技术交流和分享,可关注“开源519” 公众号。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拂去尘世尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值