使用 static_cast、dynamic_cast 或显式转换的指向基指针转换的派生指针不会调用基函数

Derived pointer to Base pointer conversion using static_cast, dynamic_cast,or explicit conversion won't call the base function

我有以下代码。

#include <iostream>
using namespace std;


class Base
{
public:
    virtual int f(){cout<<"Base"<<endl;}
};

class Derived:public Base
{
public:
    int f(){cout<<"Derived"<<endl;}
};

int main()
{
    Base b;
    Derived d;

    b.f(); ///base
    ((Base)d).f(); ///base

    cout<<"----------------"<<endl;

    Base *b1 = new Base;
    Base *b2 = new Derived;
    Derived *d1 = new Derived;

    b1->f(); ///base
    ((Base*)d1)->f(); ///derived
    ((Base*)b2)->f(); ///derived
    static_cast<Base*>(d1);
    d1->f();///derived
    static_cast<Base*>(b2);
    b2->f();///derived

    cout<<"----------------"<<endl;

    Base *b5 = dynamic_cast<Base*>(b2);
    Base *b6 = dynamic_cast<Base*>(d1);
    if(b5)
        b5->f(); ///derived
    if(b6)
        b6->f(); ///derived


    return 0;
}

我想问为什么派生的 *d1 OR b2 指针在使用显式转换 (Base)、静态转换 (static_cast(d1) ) 或动态转换 (dynamic_cast(d1)) 将不会在转换后调用基础 class 的 f() 函数。似乎每次都从派生的 class 调用 f() 函数。

此外,奇怪的是,当我以这种方式声明对象时。转换有效并调用基本函数。

Base b;
    Derived d;

    b.f(); ///base
    ((Base)d).f(); ///base

现在,我明白从 Base class 访问 f() 的正确方法是 d->Base::f(),但我为什么要使用 dynamic_cast 或 static_cast因为它们不会将派生指针转换为基数并调用正确的函数。如果可能的话,我需要一个详细的解释。谢谢!

幸运的是,对于你和我的键盘来说,解释是微不足道的:

((Base)d) 切片 对象 d 到值复制的 Base 实例。

((Base*)d1)->f() 仍然会调用派生方法,因为 Base 因此 Derived 是多态类型,尽管 ((Base*)d1) 是一个 Base* 指针,它指向一个 Derived 对象。 static_castdynamic_cast.

同上

参考:https://en.wikipedia.org/wiki/Object_slicing