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