c**a 发帖数: 316 | 1 class A
{
int x;
};
class B
{
int y;
};
class C : public A, public C
{
int z;
};
sizeof(A) = 4
sizeof(B) = 4
sizeof(C) = 12
这都没问题。
但是,
C c;
B b;
B* p = &c;
C* q = &c;
B* p1 =&b;
p和q 居然都指向同一地址,
p->y; p1->b;
由于 c 是derived, 其内部layout 和 B 不一样,
我想象应该有 不同的 offset 来使其work。 但是不是这样。
p 和 p1 都分别指向 c 和b 的开始。
p->y; p1->b; 为什么都能正常工作呢?
而且 并没有 额外分配空间, 来在 runtime 实现 offset (像Vtable 那样)。 |
c**a 发帖数: 316 | 2 没有人知道吗?
【在 c**a 的大作中提到】 : class A : { : int x; : }; : class B : { : int y; : }; : class C : public A, public C : {
|
r*********r 发帖数: 3195 | |
c**a 发帖数: 316 | 4 继承 B , typo.
【在 r*********r 的大作中提到】 : 你的代码能编译吗? class C 继承自己?
|
r*********r 发帖数: 3195 | 5 那还有什么问题?
B* p = &c; 编译的时候, 编译器算了一下offset, 加到c 的开始地址, 再赋给p. |
t****t 发帖数: 6806 | 6 你把C的地址赋给一个A*, 看看数字, 估计你就明白了
【在 c**a 的大作中提到】 : class A : { : int x; : }; : class B : { : int y; : }; : class C : public A, public C : {
|
c**a 发帖数: 316 | 7 C c;
A* p = &c;
C* q = &c;
p 和 q 的数值完全一样, 所以搞不懂。。。
如果 不一样, 我就懂了。。。
【在 t****t 的大作中提到】 : 你把C的地址赋给一个A*, 看看数字, 估计你就明白了
|
c**a 发帖数: 316 | 8 我也是这样想得。
可是 B* p = &c;
C* q = &c;
p 和 q 在数字上相等。。。
你确定在 gcc 上 他们不相等?
在 VC 2008 上 他们相等。。。。
至少我这里是。
【在 r*********r 的大作中提到】 : 那还有什么问题? : B* p = &c; 编译的时候, 编译器算了一下offset, 加到c 的开始地址, 再赋给p.
|
t****t 发帖数: 6806 | 9 you mean &c as A*, B*, C* are all the same? on gcc they are not.
#include
#include
#include
using namespace std;
class A { int a; };
class B { int b; };
class C : public A, public B { int c; };
int main() {
C c;
C *pc=&c;
B *pb=&c;
A* pa=&c;
cout<<"pc="< : 我也是这样想得。 : 可是 B* p = &c; : C* q = &c; : p 和 q 在数字上相等。。。 : 你确定在 gcc 上 他们不相等? : 在 VC 2008 上 他们相等。。。。 : 至少我这里是。
|
s******n 发帖数: 21 | 10 Tried VS2008 on Window XP (32 bit), where
C *pc=&c;
B *pb=&c;
A* pa=&c;
output:
pc=0012FF58 pb=0012FF5C pa=0012FF58
pc = pa
pb = pc + 4
No sure why you are seeing different results.
【在 c**a 的大作中提到】 : 我也是这样想得。 : 可是 B* p = &c; : C* q = &c; : p 和 q 在数字上相等。。。 : 你确定在 gcc 上 他们不相等? : 在 VC 2008 上 他们相等。。。。 : 至少我这里是。
|