c++父类指针指向子类的具体原理? http://www.zhihu.com/question/31345300
2015-12-12 20:58
591 查看
c++父类指针指向子类的具体原理?
比如我有两个类,父类A,子类是B,其中父类A有一个属性a,比如我默认构造函数设置这个a的值为0,子类B也有一个属性a,我设置这个值为1,现在我父类A的指针temp1指向子类B 的一个对象temp2,输出temp1->a值是0,但是为啥不是1呢诶,刚学这个并不是很懂
1
条评论
分享
按投票排序按时间排序
3 个回答
2赞同反对,不会显示你的姓名
刘项,http://github.com/lexdene
cnfan、专业挖坑埋自己 赞同
为了方便我解释,我把题主说的事情写成了代码:
#include <cstdio> class A{ public: A(){ a = 0; } int a; }; class B:public A{ public: B(){ a = 1; } int a; }; int main(){ B* pb = new B(); A* pa = pb; printf("a in B is: %d\n", pb->a); printf("a in A is: %d\n", pa->a); printf("value of pb is: %p\n", pb); printf("value of pa is: %p\n", pa); printf("address of pb->a is: %p\n", &(pb->a)); printf("address of pa->a is: %p\n", &(pa->a)); return 0; }
运行输出:
a in B is: 1 a in A is: 0 value of pb is: 0x7fa97ac04b20 value of pa is: 0x7fa97ac04b20 address of pb->a is: 0x7fa97ac04b24 address of pa->a is: 0x7fa97ac04b20
以下现象:
1. 输出中的第1行和第2行。
确实如题主所说,pb->a是1,pa->a是0。这应该没有任何疑问。
2. 输出中的第3行和第4行。
可以看出来,pb和pa的值完全一样(指向同一个地址)。
3. 输出中的第5行和第6行。
pb->a和pa->a的地址不一样。
以下解释:
1. 父类中的a和子类中的a是两个不同的变量。
2. p->a的地址是p的值加上a的偏移量。
3. 父类的属性一般比较靠前,父类中的a的偏移量为0,子类中的a的偏移量为4。
4. 如果p是父类的指针,p->a的地址等于p的值加上0。如果p是子类的指针,p->a的地址等于p的值加上4。
相关文章推荐
- 网络基础知识HTTP(1) --转载
- 残差学习,152层网络,微软夺冠2015 ImageNet计算机视觉识别挑战
- C++对象的内存分布和虚函数表 http://blog.sina.com.cn/s/blog_60e96a410100lirk.html
- windows几个常见网络命令解析:ping, telnet, ssh, ftp/sftp, netstat, tracert, arp
- Android之网络连接状态的判定
- SpringMVC对HTTP报文体的处理
- Android之判断手机连接的网络类型是WIFI还是2G/3G/4G
- 神经网络
- (Fun)*((int*)*(int*)(&b)); http://bbs.csdn.net/topics/320008423
- 操作系统与网络实现 之十二
- 操作系统与网络实现 之十二
- 《TCP/IP作品详细解释2:实现》笔记--Radix树路由表
- 【拔苗计划】——TCP学习笔记之TCP三次握手四次断连
- C++虚函数及虚函数表解析http://www.cnblogs.com/chinazhangjie/archive/2012/07/11/2586535.html
- 用平常语言介绍神经网络
- Xcode7 HTTP不能正常使用的方法
- wmware虚拟网卡 VMnet8 VMnet1未识别网络解决方法
- Granafa http api使用
- 来这里看HTTP服务器状态代码定义
- 服务器架设笔记——httpd插件支持mysql字符集选择