非多态类型的Dynamic_cast

Ant*_*ier 7 c++ dynamic-cast multiple-inheritance vtable vptr

我可以理解为什么dynamic_cast在这种情况下有效:

#include <iostream>

struct A{
    virtual ~A() = default;
};

struct B {
    virtual ~B() = default;
};

struct C : A, B{};

void f(const A &a) {
    if(auto p = dynamic_cast<const B*>(&a))
        std::cout << "a is a B" << std::endl;
}

int main() {
    f(C{});

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是为什么如果你从B中删除多态,它仍然有效:

#include <iostream>

struct A{
    virtual ~A() = default;
};

struct B {
};

struct C : A, B{};

void f(const A &a) {
    if(auto p = dynamic_cast<const B*>(&a))
        std::cout << "a is a B" << std::endl;
}

int main() {
    f(C{});

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是因为dynamic_cast必须只知道你给出的对象的实际类型有一个参数(如dynamic_cast<void*>/ typeid那样),并且在知道真实类型后,它知道该类型是否来自非多态基础?

ixS*_*Sci 8

根据标准([expr.dynamic.cast] p6),您投射的对象应该具有多态类型,而不是您尝试投射到的对象.

如果你考虑它,这是绝对合乎逻辑的.dynamic_cast需要一些信息才能进行转换(RTTI),并且此信息与多态类型相关联.因此,如果类型的父母是多态的并不重要,关于这个类的信息就在这里.您不需要知道其他类的RTTI来将此对象强制转换为它.您只需要知道此对象是否与您要将其转换为某种关系.