文章目录
- 【 1. 抽象类 】
- 1.1 抽象类的定义
- 1.2 抽象类的应用条件
- 1.3 实例
- 【 2. 设计策略 】
- 接口描述了类的行为和功能,而不需要完成类的特定实现。
- C++ 接口是使用 抽象类(abstract base class,也称为ABC) 来实现的。
【 1. 抽象类 】
1.1 抽象类的定义
- 如果 类中至少有一个函数被声明为纯虚函数,则这个类就是 抽象类。纯虚函数是通过在声明中使用 “= 0” 来指定的,如下所示:
class Box
{
public:
virtual double getVolume() = 0;
private:
double length;
double breadth;
double height;
};
1.2 抽象类的应用条件
- 设计抽象类的目的:是为了给其他类提供一个可以继承的适当的基类。
- 抽象类不能被用于实例化对象,它只能作为接口使用,如果试图实例化一个抽象类的对象,会导致编译错误。(相对应的,可用于实例化对象的类被称为 具体类)。
- 如果一个 ABC抽象类 的子类需要被实例化,则必须实现每个纯虚函数,这也意味着 C++ 支持使用 ABC 声明接口。 如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。
1.3 实例
- 抽象类的实例:基类 Shape 提供了一个接口 getArea(),在两个派生类 Rectangle 和 Triangle 中分别实现了 getArea(),我们可以看到:一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。
#include <iostream>
using namespace std;
class Shape
{
public:
virtual int getArea() = 0;
void setWidth(int w)
{
width = w;
}
void setHeight(int h)
{
height = h;
}
protected:
int width;
int height;
};
class Rectangle: public Shape
{
public:
int getArea()
{
return (width * height);
}
};
class Triangle: public Shape
{
public:
int getArea()
{
return (width * height)/2;
}
};
int main(void)
{
Rectangle Rect;
Triangle Tri;
Rect.setWidth(5);
Rect.setHeight(7);
cout << "Total Rectangle area: " << Rect.getArea() << endl;
Tri.setWidth(5);
Tri.setHeight(7);
cout << "Total Triangle area: " << Tri.getArea() << endl;
return 0;
}
【 2. 设计策略 】
- 面向对象的系统可能会使用一个抽象基类为所有的外部应用程序提供一个适当的、通用的、标准化的接口;然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。
- 外部应用程序提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。
- 这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。