读书人

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

发布时间: 2012-02-19 19:43:38 作者: rapoo

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

读书人网 >C++ Builder

热点推荐