c++ 为什么可以将dynamic_cast转换为非虚拟类?

azpvetkf  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(169)

如果A没有虚函数,为什么会编译?

class A {
    int a = 42;
};

class B {

    void* f() {
        return dynamic_cast<A*>(this);
    }

    virtual void my_virtual() {};
};

注意:虽然写这样的东西没有意义,但这是在基类被删除后重构的结果。我觉得应该有一个编译器错误。

qhhrdooz

qhhrdooz1#

因为这不是一个要求,也不应该是一个错误。
考虑在类中添加以下内容(将B::f()设置为公共之后):

class C: public A, public B
{
};

int main()
{
    C c;
    void* p = c.f();
}

其应该并且确实向p返回指向cA子对象的指针。
只有转换源需要为多态类型,并且只有在编译时不知道目标是源的基类时才需要。
在后一种情况下,一个好的编译器在运行时不会做任何转换。

相关问题