• 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。
  • 相关阅读:
    sql查询重复记录、删除重复记录方法大全
    查询字段所在的表/视图
    查询某张表被哪些存储过程或者视图用到的sql语句
    SQL中char、varchar、nvarchar的区别
    JS快速获取图片宽高的方法
    Git代码冲突常见解决方法
    HTML__图片轮播ion-slide-box
    oracle列出两个日期间所有日期
    myeclipse 8.0 注册码
    网页中图片旋转的几种实现方式
  • 原文地址:https://www.cnblogs.com/sharecenter/p/14688715.html
Copyright © 2020-2023  润新知