C++浅析——虚函数的动态和静态绑定
源自一道面试题,觉得很有意思
class CBase
{
public:
virtual void PrintData(int nData = 111);
};
void CBase::PrintData(int nData /* = 111 */)
{
printf("CBase::PrintData, nData = %d\n", nData);
} class CDerived : public CBase
{
public:
void PrintData(int nData = 222);
};
void CDerived::PrintData(int nData /* = 111 */)
{
printf("CDerived::PrintData, nData = %d\n", nData);
}
在main()中做如下调用:
CDerived oCDerived;
CBase* pCBase = (CBase*)&oCDerived; pCBase->PrintData();
(*pCBase).PrintData();
oCDerived.PrintData();
大家先猜猜输出结果是什么?
是不是更奇怪,我们看看反汇编的代码:
14、oCDerived.PrintData();
push 0DEh
lea ecx,[ebp-4]
call @ILT+25(CDerived::PrintData) (0040101e) ;直接调用CDerived::PrintData(),无虚表取址过程 15、((CBase)oCDerived).PrintData();
mov esi,esp
push 6Fh ;压入CBase::PrintData()形参
lea ecx,[ebp-4]
push ecx ;压入oCDerived的this指针
lea ecx,[ebp-10h]
call @ILT+10(CBase::CBase) (0040100f) ;调用CBase拷贝构造函数新创建了一个CBase对象
mov dword ptr [ebp-14h],eax
mov edx,dword ptr [ebp-14h]
mov eax,dword ptr [edx] ;取新CBase对象的虚表
mov ecx,dword ptr [ebp-14h]
call dword ptr [eax] ;调用新CBase对象的虚表的第一个函数 15.1、CBase::CBase拷贝构造函数;
mov dword ptr [ebp-4],ecx ;取this指针
mov eax,dword ptr [ebp-4]
mov dword ptr [eax],offset CBase::`vftable' (00425024) ;虚表地址赋值,直接用的CBase虚表,而没有用CDerived的虚表
mov eax,dword ptr [ebp-4] ;将this指针给eax返回 16、pCDerived->PrintData();
mov esi,esp
push 0DEh
mov ecx,dword ptr [ebp-8] ;取pCDerived
mov edx,dword ptr [ecx] ;取虚表
mov ecx,dword ptr [ebp-8] ;放入this指针
call dword ptr [edx] ;调用虚表的第一个函数,即PrintData()
C++浅析——虚函数的动态和静态绑定的更多相关文章
- C++中虚函数实现原理揭秘
编译器到底做了什么实现的虚函数的晚绑定呢?我们来探个究竟. 编译器对每个包含虚函数的类创建一个表(称为V TA B L E).在V TA B L E中,编译器放置特定类的虚函 ...
- C++虚函数【Java有虚函数吗?】
1,简单介绍 定义在基类中的函数,子类必须对其进行覆写![必须对其进行覆写?!]——Java中的接口.Abstract方法中的抽象类也有这样的要求. C++中定义: virtual void deal ...
- [转载]C++虚函数浅析
原文:http://glgjing.github.io/blog/2015/01/03/c-plus-plus-xu-han-shu-qian-xi/ 感谢:单刀土豆 C++虚函数浅析 JAN 3RD ...
- C++中的重载,隐藏,覆盖,虚函数,多态浅析
直到今日,才发现自己对重载的认识长时间以来都是错误的.幸亏现在得以纠正,真的是恐怖万分,雷人至极.一直以来,我认为重载可以发生在基类和派生类之间,例如: class A { public: void ...
- C++中虚函数的作用浅析
虚函数联系到多态,多态联系到继承.所以本文中都是在继承层次上做文章.没了继承,什么都没得谈. 下面是对C++的虚函数这玩意儿的理解. 一, 什么是虚函数(如果不知道虚函数为何物,但有急切的想知道,那你 ...
- MFC浅析(7) CWnd类虚函数的调用时机、缺省实现
CWnd类虚函数的调用时机.缺省实现 FMD(http://www.fmdstudio.net) 1. Create 2. PreCreateWindow 3. PreSubclassWindow 4 ...
- C++ 虚函数与纯虚函数 浅析
[摘要] 在虚函数与纯虚函数的学习中.要求理解虚函数与纯虚函数的定义,了解虚函数与纯虚函数在实例化上的差异.掌握两者在实现上的必要性.熟悉纯虚函数在子类与孙类的函数类型.本文即针对上述问题展开阐述. ...
- C++:抽象基类和纯虚函数的理解
转载地址:http://blog.csdn.net/acs713/article/details/7352440 抽象类是一种特殊的类,它是为了抽象和设计的目的为建立的,它处于继承层次结构的较上层. ...
- 【C++】多态性(函数重载与虚函数)
多态性就是同一符号或名字在不同情况下具有不同解释的现象.多态性有两种表现形式: 编译时多态性:同一对象收到相同的消息却产生不同的函数调用,一般通过函数重载来实现,在编译时就实现了绑定,属于静态绑定. ...
随机推荐
- jquery多次上传同一张图片
$().reset(); wrap():$('p').wrap('div');===><div><p></p></div>; .closest() ...
- 【iScroll源码学习02】分解iScroll三个核心事件点
前言 最近两天看到很多的总结性发言,我想想今年好像我的变化挺大的,是不是该晚上来水一发呢?嗯,决定了,晚上来水一发! 上周六,我们简单模拟了下iScroll的实现,周日我们开始了学习iScroll的源 ...
- PHP 后台定时循环刷新某个页面 屏蔽apache意外停止
PHP 后台定时循环刷新某个页面 如果间隔时间过长的话 会出现apache自动停止的现象.出现的原因则是设置了 <IfModule mpm_winnt_module> ThreadsPe ...
- [Android]官网《Testing Support Library》中文翻译
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5048524.html 翻译自 Android Develope ...
- Android中的Interpolator
Android中的Interpolator Interpolator用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化. 本文列出Android API提供的Interpola ...
- Win7重装系统遇到的问题以及MysQL的问题解决
连续三天因为系统的错误,android方面的软件一直不能正确运行.而且每次开机的时候QQ 微信等聊天工具也出现损坏.虽然重新下载一个可以保证在电脑不管的情况下正常的运行.可是作为玩电脑时间不长的我来说 ...
- java 中 return 的两种常见的用法
一:return语句总是用在方法中,有两个作用: 一个是返回方法指定类型的值(这个值总是确定的), 一个是结束方法的执行(仅仅一个return语句). 二:实例1 -- 返回一个String priv ...
- IOS NSTimer和CADisplayLink的用法
IOS--NSTimer和CADisplayLink的用法 NSTimer初始化器接受调用方法逻辑之间的间隔作为它的其中一个参数,预设一秒执行30次.CADisplayLink默认每秒运行60次,通过 ...
- 计算机组成原理往年试题以及答案(tzf!!!)
计算机组成原理往年试题以及答案(下载链接!!!) 太子妃升职记(1~36) ::http://pan.baidu.com/s/1dDP5Kqd
- Iconfont-阿里巴巴矢量图标库
http://iconfont.cn/ 网站为: