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那样),并且在知道真实类型后,它知道该类型是否来自非多态基础?
根据标准([expr.dynamic.cast] p6),您投射的对象应该具有多态类型,而不是您尝试投射到的对象.
如果你考虑它,这是绝对合乎逻辑的.dynamic_cast需要一些信息才能进行转换(RTTI),并且此信息与多态类型相关联.因此,如果类型的父母是多态的并不重要,关于这个类的信息就在这里.您不需要知道其他类的RTTI来将此对象强制转换为它.您只需要知道此对象是否与您要将其转换为某种关系.
| 归档时间: |
|
| 查看次数: |
196 次 |
| 最近记录: |