1 什么是抽象类?
-
面向对象中的抽象概念
-
在进行面向对象分析时,会发现一些抽象的概念。如:图形的面积如何计算?
-
在现实中需要知道具体的图形类型才能求面积,所以对概念上的“图形”求面积是没有意义的!
Shape
只是一个概念上的类型,没有具体的对象
class Shape { public: double area() { return 0; } };
-
问题:
Shape
类有必要存在么? -
面向对象中的抽象类
- 可用于表示现实世界中的抽象概念
- 是一种只能定义类型,而不能产生对象的类
- 只能被继承并重写相关函数
- 直接特征是相关函数没有完整的实现
2 抽象类与纯虚函数
-
C++ 语言中没有抽象类的概念
-
C++ 中通过纯虚函数实现抽象类
-
纯虚函数是指只定义原型的成员函数
-
一个 C++ 类中存在纯虚函数就成为了抽象类
-
纯虚函数的语法规则
= 0
用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体
class Shape { public: virtual double area() = 0; };
-
示例:抽象类
- Demo
#include <iostream> #include <string> using namespace std; //抽象类 class Shape { public: virtual double area() = 0; }; class Rect : public Shape { int ma; int mb; public: Rect(int a, int b) { ma = a; mb = b; } double area() { return ma * mb; } }; class Circle : public Shape { int mr; public: Circle(int r) { mr = r; } double area() { return 3.14 * mr * mr; } }; void area(Shape* p) { double r = p->area(); cout << "r = " << r << endl; } int main() { Rect rect(1, 2); Circle circle(10); area(&rect); area(&circle); return 0; }
-
编译运行
r = 2 r = 314.3
-
抽象类只能用作父类被继承,不可以生成对象,但可以生成抽象类的指针
-
子类必须实现纯虚函数的具体功能
-
纯虚函数被实现后成为虚函数
-
如果子类没有实现纯虚函数,则子类成为抽象类
3 接口
-
满足下面条件的 C++ 类则成为接口
- 类中没有定义任何的成员变量
- 所有的成员函数都是公有的
- 所有的成员函数都是纯虚函数
- 接口是一种特殊的抽象类
-
示例:接口
- Demo
#include <iostream> #include <string> using namespace std; class Channel { public: virtual bool open() = 0; virtual void close() = 0; virtual bool send(char* buf, int len) = 0; virtual int receive(char* buf, int len) = 0; }; int main() { return 0; }