C++多重继承和交叉委托与 void*

C++ multiple inheritance and cross delegation with void*?

本文关键字:void 多重继承 C++      更新时间:2023-10-16
class Base1
{
public:
    virtual ~Base1(){}
    virtual void whatever()
    {
        cout << "whatever" << endl;
    }
};
class Base2
{
public:
    virtual ~Base2(){}
    virtual void aFunc(int i) = 0;
};
class A : public Base1, public Base2
{
public:
    A()
    {}
    ~A()
    {}
    virtual void aFunc(int i) final
    {
        cout << "func" << endl;
    }
};
int main()
{
    void* a;
    a = new A();
    (static_cast<Base2*>(a))->aFunc(0);
    Base2* ptr = static_cast<Base2*>(a);
    ptr->aFunc(0);
    return 0;
}

此示例打印出"whatever"而不是"func",如果我将带有 void* 的行更改为 A*,则打印出"func"。这是已知行为吗?我希望是这种情况,只是不知道为什么。

这是已知行为吗?

是的。如果您转换为void*然后又转换回相同的类型,则行为是明确定义的。如果转换回其他类型,则未定义。

我希望是这种情况,只是不知道为什么。

不能保证基子对象

与完整对象具有相同的地址;事实上,如果有多个非空基类,则至少有一个子对象必须位于不同的地址。因此,从 A*Base2* 的有效转换可能需要调整指针的值,而不仅仅是将其重新解释为不同的类型。转换为void*和返回无法进行该调整。