1.什么是抽象类
- 面向对象中的抽象概念
- 现实中:需要知道具体的图形类型,才能求面积。
- Shape只是一个概念上的类型,没有具体对象
2.面向对象中的抽象类
- 可用于表示现实世界中的抽象概念
- 是一种只能定义类型,而不能产生对象的类
- 只能被继承并重写相关函数
- 直接特征是相关函数没有完整的实现
3.抽象类与纯虚函数
- 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
{
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 ret = p->area(); // 多态,根据对象的this指针
cout << "area = " << ret << endl;
}
int main()
{
Rect rect(3, 5);
Circle circle(10);
area(&rect);
area(&circle);
system("pause");
return 0;
}
- 运行结果:
- 抽象类只能用作父类被继承
- 子类必须实现纯虚函数的具体功能,如果子类没有实现纯虚函数,则子类也成为抽象类。
- 纯虚函数被实现后成为虚函数(具备继承,多态,重写)
4.C++中的接口
- 满足下面条件的C++类则称为接口
- 类中没有定义任何的成员变量
- 所有的成员函数都是公有的
- 所有的成员函数都是纯虚函数
- 接口是—种特殊的抽象类 (仅C++)
- 编程实验:接口初探
#include <iostream>
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;
}
5.小结
- 抽象类用于描述现实世界中的抽象概念
- 抽象类只用被继承不能被创建对象
- C++是通过纯虚函数实现抽象类(纯虚函数实现过后是虚函数)
- 接口是一种特殊的抽象类,它是只存在纯虚函数的抽象类
- C++中没有真正的抽象类和接口的概念