1、什么是抽象类
- 面向对象中的抽象概念
在进行面向对象分析时,会发现一些抽象的概念。图形的面积如何计算?
在现实中需要知道具体的图形类型才能求面积,所以对概念上的“图形”求面积是没有意义的!
class Shape
{
public:
double area()
{
return 0;
}
};
Shape 只是一个概念上的类型,没有具体对象
- 面向对象中的抽象类
— 可用于表示现实世界中的抽象概念
— 是一种只能定义类型,而不能产生对象的类
— 只能被继承并重写相关函数
— 直接特征是相关函数没有完整的实现
2、抽象类与纯虚函数
- C++语言中没有抽象类的概念
- C++通过纯虚函数实现抽象类
- 纯虚函数是指只定义原型的成员函数
- 一个C++类中存在纯虚函数就成为了抽象类
纯虚函数的语法规则:
class Shape
{
public:
virtual double area() = 0;
};
“= 0” 用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体
#include <iostream>
#include <string>
using namespace std;
class Shape
{
public:
virtual double area() = 0;
};
class Rect : public Shape
{
int mi;
int mj;
public:
Rect(int i, int j)
{
mi = i;
mj = j;
}
double area()
{
return mi * mj;
}
};
class Circle : public Shape
{
int mr;
public:
Circle(int r)
{
mr = r;
}
double area()
{
return 3.14 * mr * mr;
}
};
void area(Shape* p)
{
cout << p->area() << endl;
}
int main()
{
Rect rect(1, 2);
Circle circle(10);
cout << rect.area() << endl;
cout << circle.area() << endl;
area(&rect);
area(&circle);
return 0;
}
这个程序让我们了解了抽象类的概念,以及用抽象类来实现多态。本来我们不能用Shape这个抽象类来定义对象,但是我们可以用Shape这个类来定义指针,也可以用定义的指针来指向纯虚函数从而实现多态的概念。
抽象类不能拿来定义具体的对象,可以拿来定义指针,定义来的指针只可能指向抽象类的子类,抽象类的子类会把纯虚函数给实现。因此通过抽象类的指针来调用纯虚函数是没有问题的。
结论:
- 抽象类只能用作父类被继承
- 子类必须实现虚函数的具体功能
- 纯虚函数被实现后成为虚函数
- 如果子类没有实现纯虚函数,则子类成为抽象类
— 满足下面的条件的C++类则成为接口
1、类中没有定义任何的成员变量
2、所有的成员函数都是公有的
3、所有的成员函数都是纯虚函数
4、接口是一种特殊的抽象类
程序:接口的概念
#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;
}
小结:
- 抽象类用于描述现实世界中的抽象概念
- 抽象类只能用于被继承,不能用来创建对象
- C++没有抽象类的概念
- C++通过纯虚函数实现抽象类
- 类中只存在纯虚函数时称为接口
- 接口是一种特殊的抽象类