【 在 chenjy (cjy) 的大作中提到: 】
: 你这不叫虚基类,虚基类是虚继承的基类
钻石段位要懂钻石继承。开个玩笑。for your convenience:
#include <stdio.h>
#define VIR virtual
struct X { int x; };
class Y1 : VIR public X { int y1; };
class Y2 : VIR public X { int y2; };
class Z : public Y1, public Y2 {};
int main() {
Z* z = new Z;
Y1* p = z;
Y2* q = z;
z->Y1::x = 3;
printf("%lu %p %p %p %p %p\n", sizeof(Z), z, p, q, &(p->x), &(q->x));
return 0;
}
32 0xde6c20 0xde6c20 0xde6c30 0xde6c3c 0xde6c3c
#define VIR
16 0x19d0c20 0x19d0c20 0x19d0c28 0x19d0c20 0x19d0c28
看sizeof(z)没什么意义, 应该看sizeof(Z)
你说的对。路上想起来好像都是8,回来后也发现把Z写成z了,更新了。virtual的时候32出乎我的意料。我在onlinegdb试的,应该是gcc,版本不知道。
https://zhuanlan.zhihu.com/p/145900846
--
修改:billybear04 FROM 106.121.71.*
FROM 106.121.71.*