1 简介

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类, 它不能生成对象 ;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。

抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。----百度百科

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

2 纯虚函数

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

格式:

// virtual <类型><函数名>(<参数表>)=0;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 Width4SquareArea:20半径:7CircleArea153.86Lenth:0 Width0SquareArea:0


4 总结

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

根据本篇内容,总结一下使用抽象类的注意事项:

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