【发布时间】:2021-07-06 23:23:08
【问题描述】:
我开始学习动态转换以及它如何使用 RTTI 来确定向下转换的对象类型。 在这个例子中,我做了一个向上转换,从派生类到基类。
#include <iostream>
using namespace std;
class Base
{
public:
virtual void foo()
{
cout<<"Base"<<endl;
}
};
class Derived : public Base
{
public:
void foo()
{
cout<<"Derived"<<endl;
}
};
int main()
{
Derived* d = new Derived();
Base* b = dynamic_cast<Base*>(d); //(1)
cout<<typeid(b).name()<<endl;
b->foo();
return 0;
}
程序打印:
PBase
Derived
对我来说:
- 在编译过程中,编译器为基类创建一个 vTable,其中我们有一个指向 RTTI“表”的指针,以及一个指向 Base::foo 函数的指针。
- 在执行的时候,当程序到达第(1)行时,他创建了一个指向这个vTable的_vptrBase指针。
我的问题是:当我们调用 foo 函数时,程序如何打印“Derived”?为什么它不调用 Base::foo 函数?
【问题讨论】:
标签: c++ casting dynamic-cast static-cast