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,接口是一种特殊的抽象类;

此文为作者学习唐佐林老师的学习笔记,仅为交流共享之用,由此带来的后果,与作者无关;转载请注明转载出处;难免有错,欢迎指正,联系方式qunchao24@sina.com。
原文地址:https://www.cnblogs.com/sharecenter/p/14688715.html