Dan*_* Dv 6 c++ polymorphism rtti
我对 C++ 中的 RTTI 机制有些困惑。
假设有类 A 和继承自 A 的类 B。 现在考虑以下代码:
B* b = new B();
A* a = dynamic_cast<A*>(b);
Run Code Online (Sandbox Code Playgroud)
我知道具有虚方法的多态类有虚表和 vptr,但我认为指针只提供有关虚函数的信息。程序如何在运行时知道 b 的类型,使用 vptr 和 vtables?
想象一下你有
struct B {
virtual doSth() {
cout << "hello";
}
};
struct A : public B {
doSth() {
cout << "hello world";
}
};
Run Code Online (Sandbox Code Playgroud)
现在假设 A::doSth() 位于 0x0f43,B::doSth() 位于 0x0a41
那么dynamic_cast(b)可以实现为(伪代码)
if ( (address pointed to by b::doSth()) == 0x0f43 ) {
// cast is OK
} else { // (address pointed to by b::doSth()) == 0x0a41
// not possible to cast
}
Run Code Online (Sandbox Code Playgroud)
所以你真的只需要 b 保存一个指向正确的 doSth() 方法的指针来知道它的真实类型
| 归档时间: |
|
| 查看次数: |
1606 次 |
| 最近记录: |