抽象类
如果基类只想表达一些抽象的概念,并不与实际的对象相关联,这时候就可以使用抽象类。
如果一个类中有纯虚函数,则这个类是一个抽象类。
如果一类是抽象类,则这个类中一定有纯虚函数。
纯虚函数也是虚函数的一种,这种函数只有声明,没有定义。
virtual 返回值类型 函数名(参数列表) = 0;
不能直接使用抽象类作为声明类型,不存在抽象类类型的对象。(不能实例化对象)
抽象类作为基类时,具有两种情况:
● 派生类继承抽象类,覆盖并实现所有的纯虚函数,此时派生类可以作为普通类使用,即不再是抽象类。
● 派生类继承抽象类,没有把抽象类中所有的纯虚函数覆盖并实现,此时派生类也变为抽象类。等待他的派生类覆盖并实现剩余的纯虚函数。
#include <iostream>
using namespace std;
// 抽象类 :形状
class Shape
{
public:
// 纯虚函数
virtual void area() = 0; // 面积
virtual void perimeter() = 0; // 周长
virtual ~Shape()
{
}
};
// 圆形
class Circle : public Shape
{
public:
void area()
{
cout << "圆形计算面积" << endl;
}
void perimeter()
{
cout << "圆形计算周长" << endl;
}
};
// 多边形
class polygon: public Shape
{
public:
void perimeter()
{
cout << "多边形计算周长" <<endl;
}
};
// 矩形
class Rectangle :public polygon
{
public:
void area()
{
cout << "矩形计算面积" << endl;
}
void perimeter()
{
cout << "矩形计算周长" <<endl;
}
};
int main()
{
// Shape s; // 错误抽象类无法实例化对象
Circle c;
c.area();
c.perimeter();
// polygon p; // 错误 没有完全覆盖纯虚函数
Rectangle r;
r.area();
r.perimeter();
// Shape &s;
return 0;
}
使用抽象类需要注意以下几点:
● 抽象类的析构函数必须使用虚析构函数
● 抽象类支持多态,可以存在抽象类的指针或引用。
● 因为抽象类的作用是指定算法框架,因此在一个继承体系中,抽象类的内容相对丰富且重要。