c++中虚函数与功能晚绑定

来源:互联网 发布:产品宣传片制作软件 编辑:程序博客网 时间:2024/06/04 19:07

再说这个问题之前,我们先来看个程序;

#include<iostream>
using namespace std;
class Bird
{
   public:
      void show()
      {
          cout<<"this is a bird"<<endl;

      }
};
class Bigbird:public Bird
{
    public :
      void show()
      {
          cout<<"this is a bigbird"<<endl;

      }
};
class Smallbird:public Bird
{
    public :
      void show()
      {
          cout<<"this is a smallbird"<<endl;
      }
};
int diaoyongshow(Bird & p)
{
    p.show();
    return 0;
}
int main()
{
   Bird bird;
   Bigbird bb;
   Smallbird sb;
   diaosyonghow(bird);
   diaoyongshow(bb);
   diaoyongshow(sb);
   return 0;
}
程序最后输出的结果为:

this is a bigbird

this is a bigbird

this is a bigbird

但是我想输出的是

this is a bigbird

this is a bigbird

this is a smallbird

为什么会出现这个问题呢?这就需要先来说一说c++中的功能早绑定了

功能早绑定的含义就是在编译阶段就进行了绑定

如:

int diaoyongshow(Bird & p)
{
    p.show();
    return 0;
}

编译时就已经将diaoyongshow()中p与Bird类的show()绑定到一起了,所以即使你给的实参是Bird的派生类,调用的也是Bird中的show();

那么该如何解决这个问题呢?

这就涉及到了c++中功能晚绑定——virtual了

virtual 的使用形式是:
virtual 函数类型  函数名称(形参值)

{

   函数体

}

意义:

当基类中的某个函数被声明为虚函数后,此虚函数就可以在一个或多个函数中被重新定义。

在此程序中,“virtual”会告诉编译器,函数调用“p.show()”时要在运行时才能确定所调用的具体函数,因此,程序在运行时根据引用P所引用的具体对象来调用具体的函数

所以这个程序应该这样写:

#include<iostream>
using namespace std;
class Bird
{
   public:
      virtual void show()
      {
          cout<<"this is a bird"<<endl;

      }
};
class Bigbird:public Bird
{
    public :
      void show()
      {
          cout<<"this is a bigbird"<<endl;

      }
};
class Smallbird:public Bird
{
    public :
      void show()
      {
          cout<<"this is a smallbird"<<endl;
      }
};
int diaoyongshow(Bird & p)
{
    p.show();
    return 0;
}
int main()
{
   Bird bird;
   Bigbird bb;
   Smallbird sb;
   diaoyongshow(bird);
   diaoyongshow(bb);
   diaoyongshow(sb);
   return 0;
}

 

你们懂了吗???

 

0 0
原创粉丝点击