重写函数,即使在动态强制转换(upcast)之后也会隐藏



我开始了解动态转换,以及它如何使用RTTI来确定下转换对象的类型。在这个例子中,我做了一个upcast,从派生类到基类。

#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(行时,He创建一个指向此vTable的_vptrBase指针

我的问题是:程序如何打印";衍生的";当我们调用foo函数时?为什么它不调用Base::foo函数?

引用cppreference(粗体是我的(:

虚拟函数是成员函数,其行为可以在派生类中重写。与非虚拟功能相反,即使没有编译时,也会保留重写行为有关类的实际类型的信息。也就是说,如果使用对基类的指针或引用来处理派生类,对重写的虚拟函数的调用将调用该行为在派生类中定义。这样的函数调用称为虚拟函数调用或虚拟调用。

相关内容

最新更新