读书笔记 《深度探索c++对象模型》 (3)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

第四章:Function语意学
4.2 虚拟成员函数
a) 单一继承下的virtual function
    一个class只会有一个virtual table。每一个table内含其对应的class object的所有active virtual functions的函数实体地址。包括:

   这个class自己定义的virtual function,它override了一个可能存在的base class virtual function函数实体。
   继承自base class的函数实体。
   一个纯虚函数实体。

b) 多重继承下的virtual function
   在多重继承中实现virtual functions。其复杂度在于第二个以及之后的base class身上。例如: 有如上派生关系,如果有: 那么第一行会将pbase指针调整以指向Base2 subobject。否则的话,类似 这种非多态应用都会失败。而在第三行的时候,由于要调用Derived的析构,所以this指针又会被调整到Derived对象开头。
其实现是运用了一种叫Thunk的技术,在代码里面插了一小段汇编代码,用来做两件事情:调整this指针的位置,跳转到virtual function的位置。
于是,对于多重继承来说,有多少个base class,就有多少个vptr,分别指向多少张virtual table。每个virtual table的内容参见《深度探索c++对象模型》P165页的图。注意,由于base_1和derived class共享一个virtual table,所以该virtual table内的内容最多。甚至包括了Base_2::mumble。不过Base_2::mumble的真正地址存放在Base_2对应的virtual table中。所以想要通过derived class的指针条用mumble方法,需要利用thunk调整this指针,这就是下面三种情况的第2种。(注意,某base class的指针,new出来的对象是derived的,也不能调用其他base class的方法指针的类型是什么,就使用那个基类相应的virtua table。派生类和第一个base class使用的是同一个virtual table。
有三种情况,第二或者后继的base class会影响到virtual functions的支持。这时候需要利用thunk调整this指针。
c) 虚拟继承下的virtual functions 由于Point2d和Point3d的起始位置不一样,所以两者之间的转换也需要做this指针调整。所以对于Point3d object来说(编译器是VC),有两张virtual table,一个是继承下来的,里面内容z()和析构函数变成了derived class的z()和析构。mumble()应该保持不变。另一长virtual table里面多了一个virtual base class object的offset,其余一样。(见《深度探索c++对象模型》P169页的图)
不过有些编译器如GCC则是将这个offset加到第一张table中,于是GCC编译器编译的结果也只有一张virtual table。

c++ ---深度探索C++对象模型读书笔记3 3.Data 语意学 class X {}; // sizeof 得到1 class Y :public virtual X {}; // sizeof 得到8 class Z: public virtual X {}; // sizeof 得到8 class A:public Y, public Z {}; //sizeof 得到12 X中没有任何成员,但是它也不为空,它是有一个隐晦的1byte,那是被编译器安插进去的一个char,这使得这个class 生成的... 阅读详情

相关推荐

深度探索C++对象模型读书笔记3C++中的多态,这跟指针有什么关系?

  1、  C++的运行时多态因为每个派生类对象中都包含基类部分,所以可将基类类型的引用或者指针绑定到派生类对象中的基类部分,而对象本身并不会改变,仍为派生类对象。通过该指针或者引用调用虚函数时,编译器将生成代码,在运行时确定调用哪个函数,被调用的是动态类型相对应的函数,也就是派生类中定义的虚函数实现。而且,只有通过引用或者指针调用,虚函数才会在运行时确定。如果调用的是非虚函数,

宁静致远 1702

深度探索C++对象模型读书笔记(3)

深度探索C++对象模型读书笔记(3) 2010年12月20日   巨盾补补,今天你“补”了吗? 巨盾补补:是一款针对个人用户而设计的绿色漏洞补丁软件,集绿色、小巧、全面、精确于一身,是您升级系统漏洞的不二选择。 1、绿色、小巧:下载完双击即可运行,使用完即可完全删除。 2、全面:完全支持Windows XP和Windows 7 系统。 3、精确,采用的是和Windows Update...

qnf782rm 176

深度探索C++对象模型读书笔记3

深度探索C++对象模型读书笔记3)。 <br />  在visual C++ 6.0中测试如下代码:<br /> #include "iostream"<br />using namespace std;<br /><br />class X {};<br />class Y : public virtual X {};<br />class Z : public virtual X {};<br />class A : public Y,public Z {};<br /><br />int mai

Tommy(凌飞)的专栏 997

深度探索C++对象模型读书笔记3

对于一个类的成员变量的存取,如果成员是静态变量,那么通过指针(->)和通过对象(.)存取是一样的;

午夜飞行 493

深度探索C++对象模型读书笔记3

***纯虚拟函数***在设计抽象基类时,需要注意以下几点:(1)不要将destructor声明为pure virtual function;如果将destructor声明为pure virtual function,则设计者一定得定义它。因为每一个derived class destructor会被编译器加以扩展,以静态调用得方式调用其“每一个virtual base class”以及“上一层

技术资料库 1557

[读书笔记] - 《深度探索C++对象模型》第3章 Data语意学

一个空的class,如: // sizeof X == 1 class X { }; 事实上并不是空的,它有一个隐晦的1 byte,那是被编译器安插进去的一个char。这使得这个class的两个objects得以在内存中配置独一无二的地址。 1.Data Memeber的绑定 在下面的程序中,length的类型在两个member function signatuures中都解析为global typedef,也就是int。当后续再有length的nested typedef声明出现时,C++ St

浮生的博客 386

深度探索C++对象模型读书笔记——2.3 程序转化语意学

C++

smallcat20121230的专栏 373

深度探索C++对象模型读书笔记】【第3章】Data语意学

1、例子,用VS 2013编译器 #include<iostream> using namespace std; class X{}; class Y :public virtual X{}; class Z :public virtual X{}; class A :public Y, public Z{}; int main(){ cout << siz...

weixin_30790841的博客 139

深度探索C++对象模型读书笔记3) 数据成员语意学

转自codepub,只做为本人学习使用,如果侵犯了您的权力,请立即通知我删除,谢谢。 在visual C++ 6.0中测试如下代码:  在visual C++ 6.0中测试如下代码: #include "iostream"using namespace std;class X {};class Y : public virtual X {};class Z : public

553

3章 Data语意学-《深度探索C++对象模型读书笔记

本章主要讲述了以下内容:Data Member的邦定,Data Member的布局,Data Member的存取,继承Data Member,对象成员的效率,指向Data Member的指针。Data Member的邦定主要讲述了以下内容:该部分讲述了一个例子,通过例子和说明我们可以得出一个结论。那就是:在一个类一面要把类型定义和变量定义方在最开始的位置,特别是在模板代码中。Data

worldvacuum的专栏 324

深度探索C++对象模型读书笔记

` C++在布局以及存取时间上主要的额外负担是由virtual引起的,包括:虚函数机制和虚基类机制(即用以实现“多次出现在继承体系中的base class,有一个单一而被共享的尸体”) C++对象模式:在C++中有两中成员数据:static和nonstatic以及三种成员函数:static、nonstatic和virtual C++编译器的采用的对象模型: Nonstatic成员对象...

qq_15054345的博客 200

[读书笔记]《深度探索C++对象模型

文章目录前言第一章 关于对象第二章 构造函数语意学构造函数拷贝构造函数初始化列表第三章 Data 语意学第四章 Function 语意学非静态成员函数静态成员函数虚成员函数第五章 构造、析构、拷贝语意学RTTI模板函数的实现逻辑 前言 俗话说得好,好记性不如烂笔头,本文主要是重温了一下经典书籍《深度探索C++对象模型》,然后一些内容摘录,主要记录的是我自己的精简版,建议读者有相关的知识需要还是慢慢去啃一下原书比较好。 第一章 关于对象 首先介绍了 C++ 类的情况, C++类的内存存储方式是:只包含非静态成

Chris_zhangrx的博客 1475

深度探索C++对象模型读书笔记

深度探索C++对象模型读书笔记<二> 在使用C++时,常常会好奇或者抱怨,编译器为我们做了什么事呢? 为什么构造函数没有为我初始化呢?为什么我还要写默认构造函数呢? 2.1 Default Constructor 的构造操作 如果没有声明默认构造函数,编译器会在需要的时候帮我们产生出来。 为了避免在多个地方被需要导致重复,则编译器将产生的构造函数声明为inline方式。 class ...

Travelerwz的博客 262

深度探索C++对象模型》笔记目录

读书笔记,特此记录。 😇😇😇 《深度探索C++对象模型》阅读笔记 第一章 关于对象 《深度探索C++对象模型》阅读笔记 第二章 构造函数语意学 《深度探索C++对象模型》阅读笔记 第三章 Data语意学 《深度探索C++对象模型》阅读笔记 第四章 Function语意学 《深度探索C++对象模型》阅读笔记 第五章 构造、解构、拷贝语意学 《深度探索C++对象模型》阅读笔记 第六章 执行期语意学 《深度探索C++对象模型》阅读笔记 第七章 站在对象模型的尖端...

哇咔咔的博客 359

第1章读书笔记——深度探索c++对象模型

文章目录第1章 关于对象1.1 c++对象模式1.2**关键词带来的差异**1.3对象的差异 第1章 关于对象 1.1 c++对象模式 c++中有两种class data members: static和nonstatic,三种class member functions: static,nonstatic和virtual 对下面代码class point声明: class Point{ public: Point(float xval); virtual ~Point(); .

风源- 893
上一篇: 读书笔记 《深度探索c++对象模型》 (2)
下一篇: 读书笔记 《深度探索c++对象模型》 (4)
jiangyi711
博客等级 码龄19年 67粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值