多态实现原理-虚函数表内存分析及虚基类表的内存分析
来源:互联网 发布:sql server查看主键 编辑:程序博客网 时间:2024/06/05 23:04
看了深入探索C++对象模型后的一些感悟
1:虚函数表内存分析
每一个类对象的内存由nostatic data member和指向虚数表的指针之和决定。
class A{
private:
int a;
virtual void fun1();
virtual void fun2();
};
calss B: public A{
void fun2();
virtual void fun3();};
A a;
B b; A *p=&b;
A的指针指向派生类B中的基类部分,指针a无法调用B中的成员,唯一的例外是指向虚函数表的指针。即基类指针可以通过指向虚函数表的指针来调用派生类的虚函数。
继承后,派生类的虚函数表会和基类的虚函数表相融合,若存在override则在派生类的虚函数表中就覆盖掉;
像上面的例子:
一个A类的对象:
int a;
vptr;
这个vptr是指向A虚函数表的指针,A虚函数表:里存放着指向虚函数的指针,一个是指向fun1的,一个是指向fun2的
一个B类的对象:
int a,
vptr:
这个vptr是指向B的虚函数表指针,B的虚函数表与A的想融合,相同则覆盖:fun1,fun2,fun3;
这样当p=&b时,p->fun2是派生类中的fun2;当p=&a时是调用基类中的fun2
2:虚基类表
与虚函数表类似,虚继承中,一个类除了有Nonstaic data member还有指向虚基类表的指针;虚继承是避免了多继承中的变量二义性;
class A{int a;}
class B :public virtual A{int b;}
class C: public virtual A{int c};
class D:public B,public C{int d};
这样在D的对象中就有
vptrB
vptrC
int a
int b
int c
int d
vptrB,vptrC分别是从B和C的虚基类表,注意的是这里的a是虚基类A的成员,它不来自B,也不来自C!!而是直接从A中拷贝过来;
那样当D *p=&d;调用p->a时,怎么找到这个a?这就是虚基类表的作用。
虚基类表中存放这派生中基类成员在派生类内存的偏移量,这样就可以通过这找到a.
- 多态实现原理-虚函数表内存分析及虚基类表的内存分析
- 虚函数表的内存分析
- 多态的实现(内存分析)
- memcache内存使用原理及监控分析
- memcache内存使用原理及监控分析 --重在监控分析
- 逆向分析 C++继承内存分布(带虚函数) 及动态绑定实现
- 继承及内存分析
- [转]PHP函数的实现原理及性能分析
- PHP函数的实现原理及性能分析
- PHP函数的实现原理及性能分析
- PHP函数的实现原理及性能分析
- [转]PHP函数的实现原理及性能分析
- [zz]PHP函数的实现原理及性能分析
- PHP函数的实现原理及性能分析
- [转]PHP函数的实现原理及性能分析 .
- PHP函数的实现原理及性能分析
- PHP函数的实现原理及性能分析
- PHP函数的实现原理及性能分析
- Android -- Fragment 基本用法、生命周期与细节注意
- 断点续传的原理
- 蓝桥杯带分数
- 从传统投放走向程序化购买, 浅谈户外广告发展前景
- android 在onTouch中添加长按事件
- 多态实现原理-虚函数表内存分析及虚基类表的内存分析
- iOS开发,应用内直接跳转到Appstore评分
- 500g资源
- Find The Multiple
- 蓝桥杯翻硬币
- 手风琴
- PLC 定时器/计数器的使用(实验二)
- C#检验json对象是否存在对应的KEY
- 位深度讲解,opencv8位单通道和32位单通道解析