您的位置:首页 > 编程语言 > C语言/C++

C++多态性

2015-12-08 22:13 232 查看

                                      C++多态性

  首先看看这段代码的结果会是什么? “animal
breathe” or  
“fish bubble”

#include <iostream.h>

class Animal

{

public:

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()

{

Fish fh;

Animal *pAn;

pAn=&fh;

fn(pAn);

}

 到底调用的是Animal的breathe(),还是Fish的breathe()呢?

结果是:

为什么是这个结果呢。

  因为Fish对象是从Animal继承而来的,当产生Fish对象时,它首先要构造Animal,紧接着构造Fish剩余的部分,对于Animal对象和Fish对象其首地址都是一样的,都是this指针。代码pAn=&fh;虽然看着是将Fish对象的指针赋给Animal,但其实也是Animal的首地址,当它调用breathe()方法的时候,当然调用的是Animal的breathe()的方法。

 

那么我们现在想要调用Fish的breathe()方法,该怎么办呢?

我们可以在Animal的breathe()方法前加上virtual(虚拟的关键字),把这个函数定义为虚函数。

#include <iostream.h>

class Animal

{

public:

       virtualvoid breathe()

       {

      cout<<"animal breathe"<<endl;

       }

};

 

class Fish:public Animal

{

public:

   void breathe()

       {

              cout<<"fishbubble"<<endl;

       }

};

 

void fn(Animal *pAn)

{

       pAn->breathe();

}

 

void main()

{

       Fishfh;

       Animal*pAn;

       pAn=&fh;

       fn(pAn);

}

 

这时,就会看到我们想要的结果了。

 

这种情况就叫做c++的多态性。

当C++编译器在编译的时候,发现Animal类的breathe()函数是虚函数,这个时候C++就会采用迟绑定(late
binding)的技术,在运行时,依据对象的类型(在程序中,我们传递的Fish类对象的地址)来确认调用的哪一个函数,这种能力就做C++的多态性。

 

总结:在基类的相应函数前面加上virtual变成虚函数之后,如果子类中有此函数就调用子类的(前提调用子类的地址),子类没有的调用父类的。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 多态性