投射未正确显示

时间:2016-12-25 18:30:50

标签: c++

在下面的示例代码中,为什么

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;
}

1 个答案:

答案 0 :(得分:3)

当您查看具有多重继承的对象的对象布局时,您基本上会在对象中的某个位置具有基础子对象。例如,对象可能如下所示:

+-------+
+ +---+ +
| | B | |
| +---+ |
| +---+ |
| | A | |
| +---+ |
| C mem |
+-------+

当你有一个指向BA对象的指针时,它不知道它嵌入到具有多重继承的对象中。相应地,指向B子对象的指针或指向A子对象的指针不能与C对象具有相同的地址。潜在地,两个对象都没有C的地址,例如,当ABI指定C成员必须在基类子对象之前时(我不知道任何系统执行此操作) ,但是)。