铸造未正确显示

Cast not shown correctly

本文关键字:显示      更新时间:2023-10-16

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

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

当您查看具有多个继承的对象布局时,您基本上将基本子对象在对象中的某个地方。例如,对象看起来像这样:

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

当您有指向BA对象的指针时,它不知道它已嵌入具有多个继承的对象中。相应地,指向B子对象的指针或A subobject的指针不能与C对象具有相同的地址。可能,两个对象都没有与C相同的地址,例如,当ABI指定C成员必须先于基类subobjects之前(我不知道有任何系统的系统)。