鱼C论坛

 找回密码
 立即注册
查看: 3518|回复: 4

虚函数的实际存在意义是什么?

 关闭 [复制链接]
发表于 2011-5-23 15:27:54 | 显示全部楼层 |阅读模式

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

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

x
本来还以为是基类的函数为一个普遍属性,但是某些子类有特殊的功能,所以就有了虚函数,可是做了个实验,有与没有都一样:
望高手指教!
如:


  1. animal.h

  2. #ifndef A_h
  3. #define A_h
  4. class A
  5. {
  6. public:
  7. void eat();
  8. void sleep();
  9. virtual void breathe();           不管这里是否加上virtual,输出的结果都是子类的函数的行为;我是不是理解错了,
  10. };                                           该怎么理解望指教!!!!

  11. #endif







  12. fish.h

  13. #include "animal.h"

  14. #ifndef fish_h
  15. #define fish_h
  16. class F:public A
  17. {
  18. public:
  19. F(){};
  20. void breathe();
  21. };
  22. #endif








  23. animal.cpp

  24. #include "animal.h"
  25. #include <IOSTREAM>
  26. using namespace std;

  27. void A::eat()
  28. {
  29. cout<<"animal eat\n";
  30. }

  31. void A::sleep()
  32. {
  33. cout<<"animal sleep\n";
  34. }

  35. void A::breathe()
  36. {
  37. cout<<"animal breathe\n";









  38. fish.cpp

  39. #include "fish.h"
  40. #include <IOSTREAM.h>


  41. void F::breathe()
  42. {
  43. cout<<"fish bubble\n";
  44. }






  45. main.cpp

  46. #include <IOSTREAM.H>

  47. #include "animal.h"

  48. #include "fish.h"


  49. int main()
  50. {
  51. A an1;
  52. F fs1;
  53. fs1.breathe();
  54. return 0;

  55. };
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-23 16:28:07 | 显示全部楼层
主函数改为这个就看出作用了。
  1. int main(){
  2.   A an1;
  3.   F fs1;
  4.   A* p = &an1;
  5.   p->breathe();
  6.   p = &fs1;
  7.   p->breathe();
  8.   return 0;
  9. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-23 16:33:20 | 显示全部楼层
本帖最后由 weixianlang 于 2011-5-23 16:33 编辑

回复 仰望天上的光 的帖子
  1. int main()
  2. {
  3.     A an1;
  4.         F fs1;
  5.         A* P=&an1;
  6.         F* p1=&fs1;
  7.         P->breathe();
  8.         p1->breathe();
  9.         return 0;
  10.        
  11. };
复制代码
既然我可以这样访问子类,为何还要像你那样间接用一个指针?说下实际意义,比如哪些东西可以用到?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-5-23 19:11:55 | 显示全部楼层
LZ的代码对于具体类编程,使得使用这些类的人需要了解你写的每一个类,想象一种情况,我们从class A派生出很多的类,如class Fish, class cat, class dog每个类都实现了自己不同的虚函数breathe();
那么我们在main函数中可以作如下使用:
A* p = GetAnAnimal();
p->breathe();
其中GetAnAnimal();函数原型是:
A* GetAnAnimal();将随机生成某种动物的对象并返回指向它的指针。
使用该函数的人不需要知道GetAnAnimal();具体返回什么类(其实也不可能知道),只要知道返回的是个指向A类型的指针,又类型A具有函数breathe();可以调用,那么通过返回的指针调用breathe();函数,将会调用到具体类型的breathe();动作

以后假如又增加了新的动物,那么只要修改函数GetAnAnimal();而使用该函数的代码不需要作任何的修改。这个才是虚函数(面向对象)的威力-- 在实现大规模程序的时候,增加功能(增加其它动物的类)不需要修改原来的代码,只要增加代码就可以了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-5-23 22:42:38 | 显示全部楼层
回复 仰望天上的光 的帖子

大致上理解了,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-4-27 03:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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