虚函数在继承中的对象内存布局偏移

zhouzihong 2021-07-26 原文


虚函数在继承中的对象内存布局偏移

A: int a1; int a2; virtual void fun1(){} virtual void fun2(){} 

B继承A,int b1; int b2;
 
A:
vptr指向数组首元素,数组元素是A::fun1 A::fun2函数地址
a1;
a2;
B:
A(vptr指向数组首元素,数组元素是A::fun1 A::fun2函数地址/a1/a2)
b1;
b2;
 
继承类覆盖基类虚函数,类B的虚函数表不同于类A的虚函数表,字面上的覆盖
A: int a1; int a2; virtual void fun1(){} virtual void fun2(){} 

B继承A,int b1; int b2; virtual void fun1(){}
A:
vptr指向数组首元素,数组元素是A::fun1 A::fun2函数地址
a1;
a2;
B:
A(vptr指向数组首元素,数组元素是B::fun1 A::fun2函数地址/a1/a2)
b1;
b2;
 
派生类新增虚函数,类B的虚函数表不同于类A的虚函数表,字面上的新增
A: int a1; int a2; virtual void fun1(){} virtual void fun2(){} 

B继承A,int b1; int b2; virtual void fun3(){}
A:
vptr指向数组首元素,数组元素是A::fun1 A::fun2函数地址
a1;
a2;
B:
A(vptr指向数组首元素,数组元素是A::fun1 A::fun2 C::fun3函数地址/a1/a2)
b1;
b2;
 
多继承,既覆盖又新增,类ABC的虚函数表不同
A:int a1;int a2;virtual void fun1(){}virtual void fun2(){}
B:int b1;int b2;virtual void fun3(){}virtual void fun4(){}
C继承AB:int c1;int c2;virtual void fun1(){}virtual void fun4(){}virtual void fun5(){}virtual void fun6(){}
A:
vptr指向数组首元素,数组元素是A::fun1 A::fun2 函数地址
a1;
a2;
B:
vptr指向数组首元素,数组元素是B::fun3 B::fun4 函数地址
b1;
b2;
C:
A(vptr指向数组首元素,数组元素是C::fun1 A::fun2 C::fun5 C::fun6函数地址/a1/a2)
B(vptr指向数组首元素,数组元素是B::fun3 C::fun4函数地址/b1/b2)
c1;
c2;
 
如果类A没有虚函数,自然类C新增的虚函数放在类B的虚函数表后面[image:1627285376079.png]
 
如果AB都没有虚函数表,类C新建一个vptr还是要放在最前面
[image:1627285417393.png]
 
如果基类有虚函数,派生类只需要利用基类的vptr,把新增的虚函数接在基类vptr指向的虚函数表后面
如果基类没有虚函数,派生类需要自己的vptr,把新增的虚函数接在派生类vptr虚函数表
 
发表于
2021-07-26 16:02 
offer快到碗里来~ 
阅读(0
评论(0
编辑 
收藏 
举报

 

版权声明:本文为zhouzihong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhouzihong/p/15061872.html

虚函数在继承中的对象内存布局偏移的更多相关文章

随机推荐

  1. 树莓派开源项目开发笔记

    2.led 没啥新的东西 就是GPIO操作 3.key 可以设置中断方式的来实现GPIO操作  wiringP […]...

  2. Spring Boot 面试题总结

    1.什么是spring boot 答案:springboot是用来简化spring应用的初始搭建和开发过程,使 […]...

  3. ubuntu16.04 安装apache+mysql+php(WAMP)

    ubuntu16.04 安装apache+mysql+php(WAMP) Posted on 2018-12- […]...

  4. 浅谈HTTP与其工作流程

    一、什么是HTTP协议 HTTP协议(Hyper Text Transfer Protocol)翻译过来是超文 […]...

  5. OGame造船厂说明

    小型运输机(Small Cargo Ship)     小型运输机的大小和战斗机差不多,但是它们没有高效率的引 […]...

  6. Cobbler无人值守安装系统

      环境说明 系统版本    CentOS 6.9 x86_64 Cobbler是一款Linux安装服务器,可 […]...

  7. 免费领取百度云盘2048G永久空间,永久离线下载特权

    百度云盘和360云盘之间的竞争可谓争锋相对,前段时间,百度和360就网盘免费都采取了自己的措施,最终,360一 […]...

  8. 怎样用批处理命令打开CMD 并把目录指定到当前目录 超简单

    之前不知道用批处理,总是手动打开CMD cd盘符,再cd路径,现在做好了批处理发现,这。。。也太简单了 系统w […]...

展开目录

目录导航