美文网首页
5. C++ 抽象类

5. C++ 抽象类

作者: 拂去尘世尘 | 来源:发表于2020-11-29 19:44 被阅读0次

    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 总结

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

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

    相关文章

      网友评论

          本文标题:5. C++ 抽象类

          本文链接:https://www.haomeiwen.com/subject/dsmkwktx.html