c ++中的Static_cast和虚方法

时间:2015-06-20 21:01:46

标签: c++ virtual static-cast

在下面的代码中,由于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;
}

3 个答案:

答案 0 :(得分:6)

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

为了观察您可能会做的多态行为

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

答案 1 :(得分:1)

您遇到的事情称为切片。基本上静态演员会将B部分从物体上切下来,而你只保留一个A.

What is object slicing?

答案 2 :(得分:0)

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

对于预期结果,如果要使用指针,则必须在main中执行以下操作:

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