关于类包含虚函数的内存结构和虚函数调用
2015-08-22 09:30
369 查看
class A
{
public:
A(){};
~A(){};
int a,b;
virtual int getb(){return b;};
virtual int geta(){return a;}
}
class B : public A
{
public:
........
virtual int getb(){return b;};
virtual int geta(){return a;}
}
sizeof(B); 他的大小就不再是 8了 因为有一个虚函数表
内存结构
0:虚函数表
4:int a;
8: int b;
---------------
A *p = new B();
p->geta();
调用 geta()他的汇编内容是
{
ecx = p;
假如 ecx 指向了 new B() 对象
mov eax,[ecx]
//获取虚函数表
call [eax+4]
//调用虚函数
}
{
public:
A(){};
~A(){};
int a,b;
virtual int getb(){return b;};
virtual int geta(){return a;}
}
class B : public A
{
public:
........
virtual int getb(){return b;};
virtual int geta(){return a;}
}
sizeof(B); 他的大小就不再是 8了 因为有一个虚函数表
内存结构
0:虚函数表
4:int a;
8: int b;
---------------
A *p = new B();
p->geta();
调用 geta()他的汇编内容是
{
ecx = p;
假如 ecx 指向了 new B() 对象
mov eax,[ecx]
//获取虚函数表
call [eax+4]
//调用虚函数
}
相关文章推荐
- HashMap Hashtable区别
- Intent的各种属性问题以及IntentFilter配置问题
- aiSee3 矢量图像文本格式 示例
- 联想售后问答经典
- PostgreSQL Replication之第八章 与pgbouncer一起工作(5)
- Palindrome - POJ 3974 (最长回文子串,Manacher模板)
- Spring EL Operators example
- 全国省市数据库
- C++中delete和delete[]的区别
- 浅述IOS用到的BOOL类型
- Timer控件使用(System.Timers.Timer)
- JUnit4中的测试套件
- JAVA代理模式
- hdu-5384Danganronpa+多校训练+AC自动机
- 快速排序
- 用JUnit4进行参数化测试
- soapui的安装
- 优秀项目经理应备技能04-项目管理的原则
- 不要上传销的当
- PostgreSQL Replication之第八章 与pgbouncer一起工作(4)