什么是抽象类?
面向对象中的抽象概念
- 在进行面向对象分析时,会发现一些抽象的概念!
图形的面积如何计算?
在现实中需要知道具体的图形类型才能求面积,所以对概念上的”图形“求面积是没有意义的!
class Shape
{
public:
doubel area()
{
return 0;
}
};
Shape 只是一个概念上的类型,没有具体对象!
问: Shape 类有必要存在有
答:有。现实世界中存在图形概念
面向对象中的抽象类
- 可用于表示现实世界中的抽象概念
- 是一种只能定义类型,而不能产生对象的类
- 只能被继承并重写相关函数
- 直接特征是相关函数没有完整的实现
面向对象中的抽象类
- Shape 是现实世界中各种图形的抽象概念
因此:
- 程序中必须能够反应抽象的图形
- 程序中通过抽象类表示图形的概念
- 抽象类不能创建对象,只能用于继承
抽象类与纯虚函数
- C++ 语言中没有抽象类的概念
- C++ 中通过纯虚函数实现抽象类
- 纯虚函数是指只定义原型的成员函数
- 一个 C++ 类中存在纯虚函数就成为了抽象类
当设计一个类时,如果确认是一个为父类,就要考虑它有没有可能成为纯虚类。判断标准:父类会不会产生对象
- 纯虚函数语法规则
class Shape
{
public:
virtual double area() = 0;
};
"=0"
用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体。
编程实验: 抽象类初探
#include <iostream>
using namespace std;
class Shape
{
public:
virtual double area() = 0;
};
class Rect : public Shape
{
private:
int ma;
int mb;
public:
Rect(int a, int b)
{
ma = a;
mb = b;
}
double area()
{
return ma * mb;
}
};
class Circle : public Shape
{
private:
int mr;
public:
Circle(int r)
{
mr = r;
}
double area()
{
return 3.14 * mr * mr;
}
};
void area(Shape* p) // Shape 是一个抽象类,可以用来定义指针、引用
{
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
- 抽象类只能用作父类被继承
- 子类必须实现纯虚函数的具体功能
- 纯虚函数被实现后成为虚函数
如果子类没有实现纯虚函数,则子类成为抽象类
接口
满足下面条件的 C++ 类则称为接口
- 类中没有定义任何的成员变量
- 所有的成员函数都是公有的
- 所有的成员函数都是纯虚函数
- 接口是一种特殊的抽象类
一组行为的规范(函数原型)
编程: 接口初探
串口、网络、USB 等通讯行为的抽象:
#include <iostream>
using namespace std;
class Channel
{
public:
virtual bool open() = 0;
virtual void close() = 0;
virtual bool senf(char* buf, int len) = 0;
virtual bool receive(char* buf, int len) = 0;
};
int main()
{
return 0;
}
小结
- 抽象类用于描述现实世界中的抽象概念
- 抽象类只能被继承不能被创建对象
- C++ 中没有抽象类的概念
- C++ 中通过纯虚函数实现抽象类
- C++ 中没有接口的概念
- 类中只存在纯虚函时成为接口
- 接口是一种特殊的抽象类
以上内容参考狄泰软件学院系列课程,请大家保护原创!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。