在下面的示例代码中,为什么
a
被指定为004609CC
而不是004609C0
?
我期待a,b和c指向同一个地址。
为什么dynamic_Cast(a)将地址更改为004609C0
class A1
{public:
unsigned a1;
int a2;
virtual ~A1() { }
};
class B1
{public:
unsigned b1;
int b2;
virtual ~B1() { }
};
class C1 : public B1, public A1
{public:
unsigned c1;
virtual ~C1(){}
};
int main()
{
C1* c = new C1;
A1* a = c;
B1* b = c;
std::cout << static_cast<void*>(a) << "\n"; //004609CC Why not 004609C0?
std::cout << static_cast<void*>(b) << "\n"; //004609C0
std::cout << static_cast<void*>(c) << "\n"; //004609C0
std::cout << dynamic_cast<C1*>(a) << "\n"; //004609C0
// delete b;
}
答案 0 :(得分:3)
当您查看具有多重继承的对象的对象布局时,您基本上会在对象中的某个位置具有基础子对象。例如,对象可能如下所示:
+-------+
+ +---+ +
| | B | |
| +---+ |
| +---+ |
| | A | |
| +---+ |
| C mem |
+-------+
当你有一个指向B
或A
对象的指针时,它不知道它嵌入到具有多重继承的对象中。相应地,指向B
子对象的指针或指向A
子对象的指针不能与C
对象具有相同的地址。潜在地,两个对象都没有C
的地址,例如,当ABI指定C
成员必须在基类子对象之前时(我不知道任何系统执行此操作) ,但是)。