this指针的调整
我们先来看一段代码:
#include <iostream> using namespace std;
class A
{
public:
int a;
A( )
{
printf("A:A()的this指针是%p\n", this);
} void funcA( )
{
printf("A:funcA()的this指针是%p\n", this);
}
}; class B
{
public:
int b;
B( )
{
printf("B:B()的this指针是%p\n", this);
} void funcB( )
{
printf("B:funcB()的this指针是%p\n", this);
}
}; class C :public A, public B
{
public:
int c;
C( )
{
printf("C:C()的this指针是%p\n", this);
}
void funcC()
{
printf("C:funcC()的this指针是%p\n", this);
}
}; int main()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl; C cobj; cobj.funcA();
cobj.funcB();
cobj.funcC();
return ;
}
运行结果为:
第一个基类子对象A的起始地址是与派生类对象C是重合的。我们来看一张图片:

上图演示了this指针是如何调整的。在派生类的对象中,基类是作为派生类的子对象存在的,称为基类子对象,当派生类只继承于一个基类时,基类子对象的起始地址是与派生类对象相同的,而当派生类同时继承于多个基类时(多重继承,这里暂时不考虑虚拟继承)
第一个基类子对象的起始地址是与派生类对象重合的,而后续基类子对象的起始地址与派生类对象依次相差前面的基类子对象的长度,比如,D同时派生于A、B、C。D对象的起始地址是0,那么A子对象的起始地址也是0,B子对象的起始地址是0+sizeof(A),而C对象的起始地址为0 + sizeof(A) + sizeof(B)。上面的例子C类派生于A,B。C类对象的地址是006FFD4C,那么A子对象的起始地址和C类对象的起始地址是一样的为006FFD4C,B类对象的起始地址为006FFD4C + sizeof(A) = 006FFD4C + 4 = 006FFD50
如果我们把程修改成如下,输入结果会怎么样呢?
#include <iostream> using namespace std;
class A
{
public:
int a;
A( )
{
printf("A:A()的this指针是%p\n", this);
} void funcA( )
{
printf("A:funcA()的this指针是%p\n", this);
}
}; class B
{
public:
int b;
B( )
{
printf("B:B()的this指针是%p\n", this);
} void funcB( )
{
printf("B:funcB()的this指针是%p\n", this);
}
}; class C :public A, public B
{
public:
int c;
C( )
{
printf("C:C()的this指针是%p\n", this);
}
void funcC()
{
printf("C:funcC()的this指针是%p\n", this);
}
void funcB()
{
printf("C:funcB()的this指针是%p\n", this); //新增加的代码
}
}; int main()
{
cout << sizeof(A) << endl;
cout << sizeof(B) << endl;
cout << sizeof(C) << endl; C cobj; cobj.funcA();
cobj.funcB();
cobj.funcC();
return ;
}
输出结果为:
可以看到,此时三个值都相同了,C类override基类子对象B的funcB函数,此时funB()中的this指针指向C对象的起始地址。
this指针的调整的更多相关文章
- 《C与指针》第十一章练习
本章问题 1.在你的系统中,你能够声明的静态数组最大的长度能达到多少?使用动态内存分配,你最大能获取的内存块有多少? answer: This will vary from system to sys ...
- c/c++: c++继承 内存分布 虚表 虚指针 (转)
http://www.cnblogs.com/DylanWind/archive/2009/01/12/1373919.html 前部分原创,转载请注明出处,谢谢! class Base { pu ...
- 从汇编看c++成员函数指针(二)
下面先看一段c++源码: #include <cstdio> using namespace std; class X { public: virtual int get1() { ; } ...
- 从汇编看c++多重继承中this指针的变化
先来看一下下面的c++源码: #include <iostream> using namespace std; class X { public: virtual void print1( ...
- C语言精要总结-指针系列(一)
考虑到指针内容繁多,这里将指针作为一个系列,从简入繁,一点一点深挖并掌握这C语言的精华.初步计划如下 此文为指针系列第一篇: C语言精要总结-指针系列(一) 内存与地址 我们可以把内存看做一排连续的房 ...
- 虚函数指针sizeof不为sizeof(void*)
ref:http://bbs.csdn.net/topics/360249561 一个继承了两个虚基类又增加了自己的一个虚函数pif的类,sizeof(指向pif的指针)竟然是8(X86).我是从这里 ...
- 成员函数指针与高效C++委托 (delegate)
下载实例源代码 - 18.5 Kb 下载开发包库文件 - 18.6 Kb 概要 很遗憾, C++ 标准中没能提供面向对象的函数指针. 面向对象的函数指针也被称为闭包(closures) 或委托(del ...
- 关于C++中的非静态类成员函数指针
昨天发现了一个问题,就是使用对类中的非静态成员函数使用std::bind时,不能像普通函数一样直接传递函数名,而是必须显式地调用&(取地址),于是引申出我们今天的问题:非静态类成员函数指针和普 ...
- SplayTree伸展树的非递归实现(自底向上)
Splay Tree 是二叉查找树的一种,它与平衡二叉树.红黑树不同的是,Splay Tree从不强制地保持自身的平衡,每当查找到某个节点n的时候,在返回节点n的同时,Splay Tree会将节点n旋 ...
随机推荐
- CentOS7.4 删除virbr0 virbr0-nic虚拟网卡
本文摘抄自 https://www.cnblogs.com/cloudos/p/8288041.html 在CentOS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后,启动网卡时会发现有一个 ...
- setsockopt IP_ADD_MEMBERSHIP error!No such device的解决方案
/mnt # ./onvifserver Happytime onvif server version 2.6Onvif server running at 192.168.1.10:8000crea ...
- 虚拟机 VMware Tools 安装
Ubuntu 或具有图形用户界面的 Ubuntu Server 要挂载 CD 镜像并解压,请按以下步骤操作: 启动此虚拟机. 使用具有管理员权限或 root 用户权限的帐户登录此虚拟机. 选择:对于F ...
- redux学习与使用
Redux: 主要概念Action,reducer,store,state 原理:dispatch ({ type:action, preload: { val } } ) --->reduce ...
- [boost] : test库
最小化的测试套件minimal_test test库提供一个最小化的测试套件minimal_test, 类似lightweight_test适合入门级测试. 需要包含文件文#include <b ...
- 如何使用swingbench进行oracle数据库压力测试
如何使用swingbench进行oracle数据库压力测试 2014-10-06 08:09:02 标签:oracle 数据库压力测试 swingbench 原创作品,允许转载,转载时请务必以超链接形 ...
- oracle_外部表的两种实现方式oracle_loader[datapump]
外部表可以实现,通过数据库对象直接访问目录文件里的格式数据,加载方式分为两种oracle_loader和oracle_datapump,oracle_loader方式通过sqlldr引擎方式加载,访问 ...
- POJ 2139 Six Degrees of Cowvin Bacon (floyd)
Six Degrees of Cowvin Bacon Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Ja ...
- 术语-服务:PaaS
ylbtech-术语-服务:PaaS PaaS是Platform-as-a-Service的缩写,意思是平台即服务. 把服务器平台作为一种服务提供的商业模式.通过网络进行程序提供的服务称之为SaaS( ...
- python selenium-7自动发送邮件
https://jingyan.baidu.com/article/647f0115b78f8d7f2148a8e8.html 1.发送HTML格式的邮件 import smtplib from em ...