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

关于函数的覆盖和虚函数调用的疑惑解决办法

2012-02-19 
关于函数的覆盖和虚函数调用的疑惑先看代码基类: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将调用的是基类的方法.但是既然函数覆盖就可以直接调用子类,那么为什么还要用虚函数这么麻烦呢?


[解决办法]
C++primer上的例子

可以看看加不加virtual的结果

#include <stdio.h>
class MyBase
{
public:
/*virtual*/ void print()
{
printf( "调用的是基类!\n ");
}
};
class MyDerive:MyBase
{
public:
void print()
{
printf( "调用的是派生类!\n ");
}
};
void MyPrint(MyBase object,MyBase *pointer,MyBase &reference)
{
// 直到运行时刻才能确定
// 调用哪个print() 实例
object.print();
pointer-> print();
reference.print();
// 总是调用MyBase::print()
}
int main()
{
MyDerive md;
//MyPrint(md,&md,md);
MyPrint((MyBase)md,(MyBase *)&md,(MyBase)md);//这句BCB无法编译通过,VC可以
MyPrint(*((MyBase *)(&md)),(MyBase *)&md,*((MyBase *)(&md)));
return 0;
}
[解决办法]
// 直到运行时刻才能确定
// 调用哪个print() 实例
object.print();
pointer-> print();
reference.print();
// 总是调用MyBase::print()

改为

//总是调用MyBase::print()
object.print();
// 直到运行时刻才能确定
// 调用哪个print() 实例
pointer-> print();
reference.print();

热点排行