首页 > 解决方案 > 即使在动态转换(向上转换)之后,被覆盖的函数也会被隐藏

问题描述

我开始了解动态转换以及它如何使用 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

为了我:

我的问题是:当我们调用 foo 函数时,程序如何打印“Derived”?为什么它不调用 Base::foo 函数?

标签: c++castingdynamic-caststatic-cast

解决方案


引用cppreference(粗体是我的):

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


推荐阅读