鱼C论坛

 找回密码
 立即注册
查看: 2885|回复: 0

[学习笔记] 036-C++之纯虚函数、抽象类和接口

[复制链接]
发表于 2018-9-9 17:40:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 moc 于 2018-9-9 17:39 编辑

1、纯虚函数和抽象类概念
纯虚函数:一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都有自己的版本。
纯虚函数的定义:
        virtual 类型  函数名(参数表) = 0;
抽象类: 一个含有纯虚函数的基类。
纯虚函数为各派生类提供了一个公共的界面。
  1. #include "iostream"
  2. using namespace std;

  3. class figure   // 抽象类
  4. {
  5. public:
  6.         virtual void show_area() = 0;  // 纯虚函数
  7. protected:
  8.         double x;
  9.         double y;
  10. private:
  11. };

  12. class tri :public figure
  13. {
  14. public:
  15.         tri(double x = 1, double y = 2)
  16.         {
  17.                 this->x = x;
  18.                 this->y = y;
  19.         }
  20.         virtual void show_area()
  21.         {
  22.                 cout << "三角形的面积:" << x*y*0.5 << endl;  // 子类实现父类纯虚函数定义的模板
  23.         }
  24. private:
  25. private:
  26. };

  27. class square :public figure
  28. {
  29. public:
  30.         square(double x = 1, double y = 2)
  31.         {
  32.                 this->x = x;
  33.                 this->y = y;
  34.         }
  35.         virtual void show_area()
  36.         {
  37.                 cout << "四边形的面积:" << x*y << endl;
  38.         }
  39. private:
  40. private:
  41. };

  42. // 通过抽象类的纯虚函数做  接口约定 (公共界面的约定)=》来实现具体的业务模型的填充
  43. void objShow(figure* pBase)
  44. {
  45.         pBase->show_area();     // 多态
  46. }

  47. int main06()
  48. {
  49.         //figure f1; // 不能使用抽象类创建对象
  50.         figure *pBase = NULL;
  51.         tri t1;
  52.         square s1;

  53.         objShow(&t1);
  54.         objShow(&s1);
  55.         system("pause");
  56.         return 0;
  57. }
复制代码

抽象类注意事项:
        ①抽象类不能实例化,但可以声明指针和引用;
        ②抽象类不能作为返回类型和参数类型;
        ③如果一个子类继承抽象类,必须实现抽象类里面的所有纯虚函数,才能实例化;
        ④抽象类中也可以定义普通的成员函数和成员。
2、抽象类 与 接口和协议
        前文继承中提到的多继承,基本已经被实际的开发经验所抛弃,在真正的工程开发中这种多继承几乎不被使用。
原因:
        ①多继承带来的代码的复杂性要远多于其带来的便利;
        ②多继承对代码的维护性上的影响是灾难性的;
        ③在设计上,任何多继承都可以用单继承来替代。
C++中是否有Java中接口的概念?
        C++中没有接口的概念,C++是靠抽象类来实现接口的。
接口类:类中只有纯虚函数原型,没有任何数据的定义。
  1. class Interface1    // 接口类1
  2. {
  3. public:
  4.         virtual void print() = 0;
  5.         virtual int add(int i, int j) = 0;
  6. };

  7. class Interface2     // 接口类2
  8. {
  9. public:
  10.         virtual int add(int i, int j) = 0;
  11.         virtual int minus(int i, int j) = 0;
  12. };

  13. class parent  
  14. {
  15. public:
  16.         int i;
  17. };
  18. class Child : public parent, public Interface1, public Interface2
  19. {
  20. public:
  21.         void print()    //接口函数的实现
  22.         {
  23.                 cout << "Child::print" << endl;
  24.         }

  25.         int add(int i, int j)   //接口函数的实现
  26.         {
  27.                 return i + j;
  28.         }

  29.         int minus(int i, int j)   //接口函数的实现
  30.         {
  31.                 return i - j;
  32.         }
  33. };

  34. int main(int argc, char *argv[])
  35. {
  36.         Child c;
  37.         c.print();

  38.         cout << c.add(3, 5) << endl;
  39.         cout << c.minus(4, 6) << endl;

  40.         Interface1* i1 = &c;
  41.         Interface2* i2 = &c;

  42.         cout << i1->add(7, 8) << endl;
  43.         cout << i2->add(7, 8) << endl;
  44.         system("pause");
  45.         return 0;
  46. }
复制代码

上面的对接口类的多继承不会带来二义性和复杂性问题。这种多重继承也是可以通过单继承和接口来代替。
类接口只是一个功能的说明,而不是功能的实现。子类需要根据功能说明定义实现。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 05:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表