虚函数与多态性
2016-06-01 11:33
148 查看
1 概念
多态性是面向对象语言的一个重要性质,虚函数是帮助C++实现多态性的技术。
多态性体现在可以使用基类的指针调用派生类的同名函数。前提是基类的同名函数是virtual的。
2 例子
例如:
class Tool
{
Public:
Tool() {}
~Tool() {}
virtual use()
{
cout<< "Tool use" <<endl
}
}
class Pen : Public Tool
{
Public:
Pen() {}
~Pen() {}
use()
{
cout<< "Pen use" <<endl
}
}
int MyUse(Tool& tool)
{
tool.use();
return 0;
}
int main()
{
Pen pen;
MyUse(pen);
return 0;
}
执行结果是“Pen use”,在MyUse中调用的是pen的use(),符合人们的目的;
如果基类Tool的use()不是virtual,则执行结果是“Tool use”,就是说MyUse()中的tool.use()只会调用Tool类的use()。
3 使用VTABLE
编译器是怎么知道调用Pen的use()? 这是编译器做的工作,编译器在每个包含虚函数的类中建立了虚函数表VTABLE,并且分配了指向这个VTABLE的指针vptr。
编译器通过查找VTABLE,得到要执行函数的地址(vptr+n),进而执行函数。这是在运行期间确定函数地址,叫做晚绑定,与之相反的在编译期间就已确定函数地址,则称作早绑定。
多态性是面向对象语言的一个重要性质,虚函数是帮助C++实现多态性的技术。
多态性体现在可以使用基类的指针调用派生类的同名函数。前提是基类的同名函数是virtual的。
2 例子
例如:
class Tool
{
Public:
Tool() {}
~Tool() {}
virtual use()
{
cout<< "Tool use" <<endl
}
}
class Pen : Public Tool
{
Public:
Pen() {}
~Pen() {}
use()
{
cout<< "Pen use" <<endl
}
}
int MyUse(Tool& tool)
{
tool.use();
return 0;
}
int main()
{
Pen pen;
MyUse(pen);
return 0;
}
执行结果是“Pen use”,在MyUse中调用的是pen的use(),符合人们的目的;
如果基类Tool的use()不是virtual,则执行结果是“Tool use”,就是说MyUse()中的tool.use()只会调用Tool类的use()。
3 使用VTABLE
编译器是怎么知道调用Pen的use()? 这是编译器做的工作,编译器在每个包含虚函数的类中建立了虚函数表VTABLE,并且分配了指向这个VTABLE的指针vptr。
编译器通过查找VTABLE,得到要执行函数的地址(vptr+n),进而执行函数。这是在运行期间确定函数地址,叫做晚绑定,与之相反的在编译期间就已确定函数地址,则称作早绑定。
相关文章推荐
- CountDownLatch示例
- pch文件导入uikit报错 could not build module 'uikit'
- 手动激活win10的方法
- 全栈工程师到底有什么用
- 【iOS开发-91】GCD的同步异步串行并行、NSOperation和NSOperationQueue一级用dispatch_once实现单例(转载)
- 使用CSS在页面中嵌入字体
- Web性能压力测试工具之Siege详解
- Codeforces 645E Intellectual Inquiry (贪心+DP)
- 打印当月日历效果小例子
- sql分组后查找每组的前几条记录语句
- 使用Genymotion调试出现错误INSTALL_FAILED_CPU_ABI_INCOMPATIBLE解决办法
- C++数据类型简析
- (一)第一章:大数据时代莅临
- Android是最牛的
- 图片下载本地缓存时间戳显示图片方法
- 在软件开发中的抽象思想
- Oracle Logminer 说明
- Viewpager+Fragment联动+水平滚动
- Tair-淘宝自主开发的一个分布式key/value存储系统
- 用js获取当前页面的url