【发布时间】:2019-02-09 18:04:38
【问题描述】:
我可以理解为什么在这种情况下 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会做的那样),知道了真实类型之后,才知道该类型是否派生自一个非多态基?
【问题讨论】:
-
想想 vtable 然后想想 vptr。你需要哪个vtable?哪个对象需要 vptr?
标签: c++ multiple-inheritance dynamic-cast vtable vptr