我可以理解为什么 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;
}
但是为什么如果你从 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;
}
是不是因为 dynamic_cast 必须只知道你给的对象的真实类型有一个参数(就像dynamic_cast<void*>
/ typeid 会做的那样),而在它知道真实类型之后,它才知道该类型是否是从非多态基派生的?