返回信息流问题分析见http://blog.sina.com.cn/s/blog_5ef988640100csxa.html这里有详细解释
若A B无继承关系,pa、pb指向的地址是一样的。
可为什么当B为A的派生类时,pa的值会比pb大4,也就是指向的地址就会变化??
哪位大侠能不能详细解释一下原理,谢谢
class A{
public:
int a;
};
class B
{
public:
int b;
};
int main()
{
B *pb=new B();
A *pa=(A *)(pb);
printf("%p\n",pa);
printf("%p\n",pb);
return 0;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #76941同步于 2014/2/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
指针经强制类型转换后为何指向的地址变了?
Shero1
2014/2/14镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
代码就在上面啊 另一种代码就是B继承了A而已
【 在 YouXia 的大作中提到: 】
: 地址不会变化的,你弄错了,你修改下代码再看看,如果不行,贴下代码吧。
这是C++的一个特性:单一对象可能拥有一个以上的地址(例如,以“Base*” 指向它时的地址 和 以“Derived*”指向它时的地址)。
上述所说的“一个以上”,意味着多继承也会发生这种情况。
给出的建议是:尽量不使用强制类型转换。
我也是一知半解,详细的请参考《Effective C++》中的条款27:尽量少做转型动作。
类堆栈生长方向,看Result分析:
#include <stdio.h>
class A{
public:
A() { a = 1; }
int a;
};
class B : public A
{
public:
B() { b = 2; }
int b;
};
int main()
{
B* pb = new B;
A* pa = (A*)pb;
printf("%p, %p\n", pa, pb);
printf("%p, %p, %p\n", &(pb->b), &(pb->a), &(pa->a));
return 0;
}
Result:
00A00CE8, 00A00CE8
00A00CEC, 00A00CE8, 00A00CE8
Process returned 0 (0x0) execution time : 0.009 s
Press any key to continue.
赞 就是这个样子的 这里有详细解释http://blog.sina.com.cn/s/blog_5ef988640100csxa.html
【 在 aisle 的大作中提到: 】
: 这是C++的一个特性:单一对象可能拥有一个以上的地址(例如,以“Base*” 指向它时的地址 和 以“Derived*”指向它时的地址)。
: 上述所说的“一个以上”,意味着多继承也会发生这种情况。
: 给出的建议是:尽量不使用强制类型转换。
: ...................
难道与编译器关系比较大,你看楼上的地址就是不变的,即使有虚函数也不会变化。
我的见解是不变的,又不是多态(调用函数的地址),你贴下你windows下运行的数据吧。
【 在 Shero1 的大作中提到: 】
: 赞 就是这个样子的 这里有详细解释http://blog.sina.com.cn/s/blog_5ef988640100csxa.html
代码及结果如下:
#include<stdio.h>
#include<iostream>
using namespace std;
class A{
public:
int a;
};
class B
{
public:
int b;
};
class C:public A,public B
{
public:
int c;
};
int main()
{
C *pc=new C();
A *pa=(A *)(pc);
B *pb=(B*)(pc);
printf("%p\n",pa);
printf("%p\n",pb);
printf("%p\n",pc);
return 0;
}
【 在 AK47 的大作中提到: 】
: 难道与编译器关系比较大,你看楼上的地址就是不变的,即使有虚函数也不会变化。
: 我的见解是不变的,又不是多态(调用函数的地址),你贴下你windows下运行的数据吧。
【 在 Shero1 的大作中提到: 】
: 代码及结果如下:
: #include<stdio.h>
: #include<iostream>
: ...................
按照你贴的这个代码应该就对了
这里是多重继承的例子 和单继承不完全一样
pb指向的是“不是最靠左的子对象”
C的对象模型应该是:4 byte的a, 4 byte的b和4 byte的c,
其中pc存放的是类型C的对象的起始地址,即其中成员变量a的地址,也即是pa存放的地址,
而pb存放的是这个对象模型的第二个成员变量即b的地址,
这里成员变量b就是“不是最靠左的子对象”
具体可看下《深入理解C++对象模型》第二章就明白了,就是讲这个的。
我现在手头没这本书,只是描述了下大概意思,但愿能看懂。。。
你这个是多重继承啊。但是你看pa与pc地址也是相同的,你题目描述的情景下,单继承下pa与pb的值是相同的。
【 在 Shero1 的大作中提到: 】
: 代码及结果如下:
: #include<stdio.h>
: #include<iostream>
: ...................