版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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++中没有真正的抽象类和接口的概念