Static_cast 和 c++ 中的虚方法

Static_cast and virtual methods in c++

在下面的代码中,由于 name() 是虚拟的,我希望调用派生结构的方法。反之,写出来的是"A"。为什么?

#include <iostream>
using namespace std;
struct A {
    virtual string name() { return "A"; }
};
struct B : A {
    string name() { return "B"; }
};
int main (int argc, char *argv[]) {
    B b;
    cout << static_cast<A>(b).name() << endl;
    return 0;
}

正如 oliver Charlesworth 在评论中提到的,您需要对象的指针或引用才能查看多态性的影响。然后系统会识别对象的动态类型并调用相应的函数。 Anton Savin 的回答中解释了如何使用引用调用多态性。

为了达到预期的效果,如果你想使用指针,你必须在main中做如下:

A *a= new B();
cout << a->name() << endl;

static_cast<A>(b) 创建一个 A 类型的临时变量,该变量由 b 构建。所以调用 name() 确实会调用 A::name().

为了观察多态行为你可能会做

static_cast<A&>(b).name()

您遇到的情况称为切片。本质上,静态转换会将 B 部分从对象中切掉,而您只保留 A。

What is object slicing?