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 总结
本篇文章主要记录抽象类的概念及具体展现实例,抽象类的作用更类似于对方法接口的规范,即在抽象类中声明需要用到的方法名为纯虚函数,子类编程中就无须重新定义方法名,只需要实现抽象类的纯虚函数即可。
根据本篇内容,总结一下使用抽象类的注意事项:
- 包函数纯虚函数的类都称为抽象类。
- 抽象类不可用于直接定义对象,只能在由实现了纯虚函数的子类定义对象。
- 继承于抽象类的子类,必须实现抽象类中的纯虚函数。
网友评论