首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于函数的覆盖和虚函数调用的疑惑解决思路

2012-03-17 
关于函数的覆盖和虚函数调用的疑惑先看代码基类:classanimal{public:voidbreathe(){cout animalbreat

关于函数的覆盖和虚函数调用的疑惑
先看代码
基类:
class   animal
{
public:
void   breathe()
  {
    cout < < "animal   breathe " < <endl;
  }
};
子类:
class   fish:public   animal
{
public:
  void   breathe()
  {
    cout < < "fish   bubble " < <endl;
  }
};

void   main()
{
fish   fh;
fh.breathe()
}
这个调用的结果是调用子类的方法.这个是函数覆盖
再看一个.

#include   <iostream.h>
class   animal
{
public:

virtual   void   breathe()
  {
    cout < < "animal   breathe " < <endl;
  }
};
class   fish:public   animal
{
public:
  void   breathe()
  {
    cout < < "fish   bubble " < <endl;
  }
};

void   fn(animal   *pAn)
{
  pAn-> breathe();
}
void   main()
{
  animal   *pAn;
  fish   fh;
  pAn=&fh;
  fn(pAn);
}
这个调用的还是子类的方法.这个是不是多此一举了呢?我知道不加virtaul将调用的是基类的方法.但是既然函数覆盖就可以直接调用子类,那么为什么还要用虚函数这么麻烦呢?



[解决办法]
这个调用的还是子类的方法.这个是不是多此一举了呢?我知道不加virtaul将调用的是基类的方法.但是既然函数覆盖就可以直接调用子类,那么为什么还要用虚函数这么麻烦呢?
----
这个调用的是 fish 的方法了
[解决办法]
LZ的测试写的有问题(多态都要用指针或者引用,指针居多)
对于第一种情况
void main()
{
fish* fh = new fish;
fh-> breathe();
animal* an = new fish;
an-> breathe();
}
程序的调用与真实的对象无关,因为这已经在编译的时候确定了。
第二种情况应该是
void main()
{
animal *pAn=new fish;
fish* fh = new fish;
fn(fh);
fn(pAn);
}
程序的调用与指针无关,与真实的对象有关,这才是多态。
另外最好把fish中的那个函数前面加个关键字,这样更规范些
virtual void breathe()

热点排行