博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度探索C++对象模型读书笔记(2)
阅读量:4520 次
发布时间:2019-06-08

本文共 2162 字,大约阅读时间需要 7 分钟。

以下测试平台均为vs 2012

指向Data Member的指针测试(1)

#include 
class Base1{public: int val1; int val2;};class Base2{public: int val3; int val4;};class Device : public Base1, public Base2{public: int vald;};void func1( int Device::*dmp, Device * pd ){ printf( "Device::val3 = %d \n", pd->*dmp );}void func2( Device * pd ){ int Base2::*dmp = &Base2::val3; printf( "&Base::val3 = %p \n", dmp ); func1( dmp, pd );}int main(){ Device a; a.val1 = 1; a.val2 = 2; a.val3 = 3; a.val4 = 4; a.vald = 5; func2( &a ); return 0;}

测试结果

结论:编译器会自动转换父类member的offset

 

指向Data Member的指针测试(2)

#include 
class Base1{public: int val1; int val2;};class Base2{public: int val3; int val4;};class Device : public Base1, public Base2{public: int vald;};int main(){ printf( "&Base1::val1 = %p \n", &Base1::val1 ); printf( "&Base1::val2 = %p \n", &Base1::val2 ); printf( "&Base2::val3 = %p \n", &Base2::val3 ); printf( "&Base2::val4 = %p \n", &Base2::val4 ); printf( "&Device::val1 = %p \n", &Device::val1 ); printf( "&Device::val2 = %p \n", &Device::val2 ); printf( "&Device::val3 = %p \n", &Device::val3 ); printf( "&Device::val4 = %p \n", &Device::val4 ); printf( "&Device::vald = %p \n", &Device::vald ); return 0;}

测试结果

结论:继承的 member直接存放在Device中,因此vald的offset = sizeof(Base1) + sizeof(Base2) = 8 + 8 = 0x10;

 

指向Data Member的指针测试(3)

#include 
class Base1{public: int val1; int val2;};class Base2{public: int val3; int val4;};class Device : virtual public Base1, virtual public Base2{public: int vald;};int main(){ printf( "&Base1::val1 = %p \n", &Base1::val1 ); printf( "&Base1::val2 = %p \n", &Base1::val2 ); printf( "&Base2::val3 = %p \n", &Base2::val3 ); printf( "&Base2::val4 = %p \n", &Base2::val4 ); printf( "&Device::val1 = %p \n", &Device::val1 ); printf( "&Device::val2 = %p \n", &Device::val2 ); printf( "&Device::val3 = %p \n", &Device::val3 ); printf( "&Device::val4 = %p \n", &Device::val4 ); printf( "&Device::vald = %p \n", &Device::vald ); return 0;}

测试结果

结论:虚拟继承的父类被存放于一张表中,以指针指向,因此vald的offset = sizeof(*p) = 4;

转载于:https://www.cnblogs.com/kirito/p/3118560.html

你可能感兴趣的文章
git的安装和简单使用
查看>>
20151024-1025-威海-第5届全国高校软件工程专业教育年会参会总结
查看>>
Airplace平台
查看>>
TinyOS实例介绍
查看>>
css hack 尽我所见
查看>>
[转]ORACLE联机日志文件无故全部消失
查看>>
Javascript基础学习12问(四)
查看>>
[原]VS2012入门图文教程——第一个程序Hello World
查看>>
#pragma once 与 #ifndef 解析(转载)
查看>>
swift 数据存储
查看>>
Objective-C内存管理教程和原理剖析(三)
查看>>
最大子数组
查看>>
pyton random 模块
查看>>
.bat以管理员身份运行
查看>>
如何用3升和5升桶量取4升水?
查看>>
部署kubernetes1.8.3高可用集群
查看>>
1017
查看>>
C++中数字和字符串的转换
查看>>
eclipse -- git 提示
查看>>
C#调用exe工作目录
查看>>