C++中的抽象类和接口
1,在 C++ 语言中,并不直接支持面向对象中的抽象类和接口概念,但是 C++ 语言 却可以间接实现这些概念;
2,什么是抽象类:
1,面向对象中的抽象(其实就是分类)概念:
1,在进行面向对象分析时,会发现一些抽象的概念,如图形的面积如何计算?
2,图形类:
1,图形的面积是不能计算的,肯定要问是什么图形的面积(这就是继承);
2,通过分类的方式将实际的图形分为一类,统称为图形(这就是将实际对象抽象,编程抽象类);
3,在现实中需要知道具体的图形类型才能求面积,所以对概念上的“图形求面积没有意义的;
1 class Shape // 有必要在程序中开发这样一个图形类出来,这样的抽 象概念应该作为父类存在; 2 { 3 public: 4 double area() // 返回当前图形的面积,之后的图形类要重写这个函数; 5 { 6 return 0; 7 } 8 };
4,Shape 只是一个概念上的类型,没有具体对象;
1,必须要保证这一点;
2,架构师告诉所有开发者,Shape 类只能继承,不能创建对象,但是不能保证别人强制执行;
3,要反应现实世界中图形的概念;
3,Shape 类有必要存在吗?
1,有
4,面向对象中的抽象类(现实世界的重要概念,且面向对象理论也支持):
1,可用于表示现实世界中的抽象概念;
2,是一种只能定义类型,而不能产生对象的类;
3,只能被继承并重写相关函数;
1,抽象类作用就只是被继承;
2,设计中,如果一个类是父类,就要考虑它有没有必要成为一个抽象类,判断准则是这个父类有没有必要产生一个对象,没必要则做成抽象类;
4,直接特征是相关函数没有完整的实现;
1,抽象类的特点就是有些函数没有完整实现;
5,Shape 是现实世界中各种图形的抽象概念,因此:
1,程序中必须能够反映抽象的图形;
2,程序中通过抽象类表示图形的概念;
3,抽象类不能创建对象,只能用于继承;
6,抽象类与纯虚函数:
1,C++ 语言中没有抽象类的概念;
2,C++ 中通过纯虚函数实现抽象类;
3,纯虚函数是指只定义原型的成员函数;
1,只有声明就可以;
4,一个 C++ 类中存在纯虚函数就成为了抽象类;
7,纯虚函数的语法规则:
1,代码示例:
1 class Shape 2 { 3 public: 4 virtual double area() = 0; 5 };
2,“=0” 用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体;
1,如果定义了类对象,编译器直接报错;
8,抽象类初探编程实验:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 class Shape 7 { 8 public: 9 virtual double area() = 0; 10 }; 11 12 class Rect : public Shape 13 { 14 int ma; 15 int mb; 16 public: 17 Rect(int a, int b) 18 { 19 ma = a; 20 mb = b; 21 } 22 23 double area() // 重写纯虚函数,纯虚函数也是虚函数,意味着可以实现多态; 24 { 25 return ma * mb; 26 } 27 }; 28 29 class Circle : public Shape 30 { 31 int mr; 32 public: 33 Circle(int r) 34 { 35 mr = r; 36 } 37 38 double area() 39 { 40 return 3.14 * mr * mr; 41 } 42 }; 43 44 void area(Shape* p) // 抽象类可以定义指针;这个指针指向子类,子类中现了纯虚函数;设计模式中很多这样的例子; 45 { 46 double r = p->area(); // 可以用抽象类指针调用子类虚函数;抽象类中的 area() 没有实现,但是子类的 area() 实现了;综上 p 指针指向的只可能是 Shape 这个抽象类的子类,而这个子类肯定必须要实现这个纯虚函数,实现这个纯虚函数后就有函数体就能够调用了,并且纯虚函数也是虚函数,所以说这里可以展现多态; 47 48 cout << "r = " << r << endl; 49 } 50 51 int main() 52 { 53 Rect rect(1, 2); 54 Circle circle(10); 55 56 area(&rect); 57 area(&circle); 58 59 return 0; 60 }
9,抽象类与纯虚函数用法:
1,抽象类只能用作父类被继承;
2,子类必须实现纯虚函数的具体功能;
1,必须实现所有的纯虚函数,否知子类依旧是抽象类;
3,纯虚函数被实现后称为虚函数;
4,如果子类没有实现纯虚函数,则子类成为抽象类;
10,满足下面条件的 C++ 类则称为接口:
1,类中没有定义任何的成员变量;
2,所有的成员函数都是共有的;
3,所有的成员函数都是纯虚函数;
4,接口是一种特殊的抽象类;
1,C++ 中没有真正的接口概念,只能通过特殊的抽象类来模拟接口行为;
2,面向对象理论里面,接口是比较抽象的概念,其是一组行为的规范;
3,用程序设计语言说接口比较容易理解,在程序设计语言里面,接口就可以认为是一组函数原型,我们依次作为依据,通过满足上述三个条件的抽象类来得到接口;
4,C++ 中没有真正的接口,但是其后续语言比如 C#、Java 就可以看到接口的概念,后续这两个语言直接支持接口的概念;
11,接口初探编程实验:
1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 /* 抽象类实现下列四种方式的操作 */ 7 class Channel // 抽象的概念,对应抽象概念; 8 { 9 public: 10 virtual bool open() = 0; // 定义一个操作,对应到面向对象中就是一个成员函数;打开; 11 virtual void close() = 0; // 关闭 12 virtual bool send(char* buf, int len) = 0; // 收 13 virtual int receive(char* buf, int len) = 0; // 发 14 };
1,满足接口的条件,所以是接口;
2,还是抽象类;
3,接口概念在 C++ 中项目和 Qt 课程中应用;
4,接口在面向对象分析与设计、面向对象编程中有重要应用;
1,网络编程:
1,从网络上收数据,处理完了后又从网络上发出去,就是收发的工作;
2,串口编程(这里要重点掌握):
1,将数据从串口发出去,然后再从串口收上来;
3,蓝牙、USB 编程:
1,将数据通过蓝牙、USB 收上来,处理完后,然后再发出去;
5,总结:
1,都是收发,只不过介质不同;
2,介质分别是:以太网、计算机串口、近距离无线编程、USB 口。
6,接口:
1,打开、收、发、关闭。
11,小结:
1,抽象类用于描述现实世界中的抽象概念;
2,抽象类只能被继承不能创建对象;
3,C++ 中没有抽象类的概念;
4,C++ 中通过纯虚函数实现抽象类;
5,类中只存在纯虚函数时成为接口;
6,接口是一种特殊的抽象类;