鱼C论坛

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

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

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

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

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

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

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

#endif



 
 
 
 
fish.h

#include "animal.h"

#ifndef fish_h
#define fish_h
class F:public A
{
public:
F(){};
void breathe();
};
#endif


 
 
 
 
 
 
animal.cpp

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

void A::eat()
{
cout<<"animal eat\n";
}

void A::sleep()
{
cout<<"animal sleep\n";
}

void A::breathe()
{
cout<<"animal breathe\n";









fish.cpp

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


void F::breathe()
{
cout<<"fish bubble\n";
}




 
 
main.cpp

#include <IOSTREAM.H>

#include "animal.h"

#include "fish.h"


int main()
{
A an1;
F fs1;
fs1.breathe();
return 0;

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

回复 仰望天上的光 的帖子
int main()
{
    A an1;
        F fs1;
        A* P=&an1;
        F* p1=&fs1;
        P->breathe();
        p1->breathe();
        return 0;
        
};
既然我可以这样访问子类,为何还要像你那样间接用一个指针?说下实际意义,比如哪些东西可以用到?
想知道小甲鱼最近在做啥?请访问 -> 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, 2025-2-6 23:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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