关于函数的覆盖和虚函数调用的疑惑
先看代码
基类:
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();