让我们来看一下下面的案例
struct A{
virtual ~A(){}
};
struct B : public A{
virtual ~B(){}
};
struct C : public B{
virtual ~C(){}
};
int main(){
A* a = new C();
B* b = dynamic_cast<B*>(a);
}dynamic_cast如何知道B在运行时是C的超类。我知道dynamic_cast访问*a的type_info,并通过检查name属性发现*a实际上是C类型。但是,如果没有编译器拥有的关于类继承的所有信息,dynamic_cast如何知道B是C的超类,只包含*a的类型是C的信息?这有什么意义吗?
发布于 2020-11-22 02:30:52
前提是错误的:dynamic_cast确实拥有它需要的所有信息。编译器在执行时将类型信息编码在只读类型信息记录中,这些记录是二进制文件的一部分。嵌入在每个多态对象中的vtable指针允许dynamic_cast找到这种“烘焙的”类型信息,因为虚方法表包含的信息不仅仅是方法指针。这是它的常见实现方式,也是x86-64上固定ABI的问题,即该体系结构的所有编译器都使用相同的iirc对此信息进行编码。
https://stackoverflow.com/questions/64946442
复制相似问题