C++深度解析(39)—多态的概念和意义

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_22847457/article/details/96991344

1.函数重写回顾

  • 父类中被重写的函数依然会继承给子类
  • 子类中重写的函数将覆盖父类中的函数
  • 通过作用域分辨符(::)可以访问到父类中的函数

 
 
  1. Child   c;
  2. Parent*  p  =  & c;
  3. c. Parent:: print();    // 从父类中继承
  4. c. print()             // 在子类中重写,如果不能使用多态,那么重写无意义。
  5. p-> print();           // 父类中定义

2.多态的概念

  • 面向对象中期望的行为
  • 根据实际的对象类型判断如何调用重写函数
  • 父类指针(引用)
    • 指向父类对象时,则调用父类中定义的函数
    • 指向子类对象时,则调用子类中定义的重写函数(前提是父类的函数被virtual修饰)
  • 面向对象中的多态的概念
    • 根据实际的对象类型决定函数调用的具体目标
    • 同样的调用语句在实际运行时有多种不同的表现形态

  • C++语言直接支持多态的概念
    <ul><li>通过使用<span style="color:#f33b45;"><strong>virtual</strong></span>关键字对多态进行支持&nbsp;</li>
    	<li><strong><span style="color:#f33b45;">被virtual声明的函数被重写后具有多态特性&nbsp;</span></strong></li>
    	<li>被<span style="color:#f33b45;"><strong>virtua</strong>l</span>声明的函数叫做<strong><span style="color:#f33b45;">虚函数</span></strong>&nbsp;</li>
    </ul></li>
    <li>编程实验——<strong>多态</strong></li>
    

 
 
  1. #include<iostream>
  2. using namespace std;
  3. class Parent
  4. {
  5. public:
  6. virtual void print()
  7. {
  8. cout << "I am Parent!" << endl;
  9. }
  10. };
  11. class Child : public Parent
  12. {
  13. public:
  14. void print()
  15. {
  16. cout << "I am Child!" << endl;
  17. }
  18. };
  19. void how_to_print(Parent *p)
  20. {
  21. p->print(); // 展现多态的行为
  22. }
  23. int main()
  24. {
  25. Parent p;
  26. Child c;
  27. how_to_print(&p);
  28. how_to_print(&c);
  29. system( "pause");
  30. return 0;
  31. }

3.多态的意义

  • 在程序运行过程中展现出动态的特性
  • 函数重写(子类重写父类函数)必须多态实现,否则没有意义
  • 多态是面向对象组件化程序设计的基础特性

4.理论中的概念

  • 静态联编:在程序的编译期间就能确定具体的函数调用(如函数重载
  • 动态联编:在程序实际运行后才能确定具体的函数调用(如函数重写

5.实例分析

  • 动态联编与静态联编    

 
 
  1. #include <iostream>
  2. using namespace std;
  3. class Parent
  4. {
  5. public:
  6. virtual void func()
  7. {
  8. cout << "void func()" << endl;
  9. }
  10. virtual void func(int i)
  11. {
  12. cout << "void func(int i) : " << i << endl;
  13. }
  14. virtual void func(int i, int j)
  15. {
  16. cout << "void func(int i, int j) : " << "(" << i << ", " << j << ")" << endl;
  17. }
  18. };
  19. class Child : public Parent
  20. {
  21. public:
  22. void func(int i, int j)
  23. {
  24. cout << "void func(int i, int j) : " << i + j << endl;
  25. }
  26. void func(int i, int j, int k)
  27. {
  28. cout << "void func(int i, int j, int k) : " << i + j + k << endl;
  29. }
  30. };
  31. void run(Parent *p)
  32. {
  33. p->func( 1, 2); // 展现多态的特性
  34. // 动态联编
  35. }
  36. int main()
  37. {
  38. Parent p;
  39. p.func(); // 静态联编
  40. p.func( 1); // 静态联编
  41. p.func( 1, 2); // 静态联编
  42. cout << endl;
  43. Child c;
  44. c.func( 1, 2); // 静态联编
  45. cout << endl;
  46. run(&p);
  47. run(&c);
  48. cout << endl;
  49. Parent *p2 = &c;
  50. p2->func(); //动态联编,virtual函数,尽管func()在Child中没有重写
  51. p2->func( 5, 6); //动态联编,
  52. system( "pause");
  53. return 0;
  54. }
  • 运行结果

  • 使用父类指针(引用)时,函数前加virtual为动态联编没加virtual为静态联编
  • 使用父类或子类自身声明对象加不加virtual都是静态联编的

6.小结

  • 函数重写只可能发生在父类子类之间
  • 根据实际对象的类型确定调用的具体函数
  • virtual关键字时C++中支持多态的唯一方式
  • 被重写的虚函数可表现出多态的特性
  • 多态是面向对象的重要特性,简单说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。 编程就是一个将具体事务抽象化的过程,多态就是抽象化的一种体现,把一系列具体事务的共同点抽象出来,再通过这个抽象的事物,与不同的具体事物进行对话。
  • 例:对不同对象发出相同的消息将会有不同的行为。比如说领导说九点钟开始工作,不同部门岗位的员工做不同的工作。
  • 多态的作用:
    1. 应用程序不必为每一个派生类编写功能调用,只需要对基类进行处理即可。大大提高程序的可复用性。 //继承
    2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩展性和可维护性。//多态~ switch

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值