C++ 多重继承和与 void* 的交叉委托(delegate)?

标签 c++ void-pointers

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”。这是已知行为吗?我希望情况会如此,只是不知道为什么。

最佳答案

Is this a known behavior?

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

I would expect that's the case just don't know why.

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

关于C++ 多重继承和与 void* 的交叉委托(delegate)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29350556/

相关文章:

C++ IDE 不支持深色主题

c++ - GCC 没有链接正确的库

c++ - 未定义、未指定和实现定义的行为

c++ - 有没有合理的替代重载和完美转发的方案?

c++ - BlackBerry 10 中的弹出窗口

c++ - 删除 void 指针指向的内存

c++ - 为什么不能 static_cast 双空指针?

c - 在C中传递Void类型参数

c - 将整数值转换为 void* 是回调中常用的范例吗?

c++ - 接口(interface)中虚函数的返回值