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