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;
}
你们懂了吗???
- c++中虚函数与功能晚绑定
- 3.5实现功能的晚绑定--虚函数【C++】
- C++中虚函数与晚绑定的编译器实现
- C++中虚函数与晚绑定的编译器实现
- 绑定与虚函数
- 5.3功能早绑定和晚绑定【C++】
- 虚函数与动态绑定
- 虚函数与动态绑定
- C/C++中多态性与虚函数
- C语言中,strstr函数的功能
- 一些c中常用的功能函数
- C++中虚函数 绑定的编译器实现(baidu 面试)
- 虚函数,静态与动态绑定
- 虚函数表与动态绑定
- VB中延时功能与Sleep函数
- C++中动态类型与动态绑定、虚函数、运行时多态的实现
- C中数组与函数
- JavaScript中函数传入参数与外部变量绑定
- Android开发总结
- 【uml】之类图中的关系
- Android开发之旅:环境搭建及HelloWorld
- C++中的引用
- 项目管理心得:一个项目经理的个人体会、经验总结
- c++中虚函数与功能晚绑定
- C/C++中extern关键字详解
- 多线程概念
- 实战4--读入文件统计
- Java_JavaEE_轻量_Struts2文件上传闲谈;
- 参数和方法重载
- 九度1527:最大子数组
- php中exit、die和return的区别
- Clone Anything with JavaScript