2015-06-20 72 views
1

在下面的代码中,由于name()是虚拟的,所以我期望派生结构的方法将被调用。相反,写出来的是“A”。为什么?static_cast和C++中的虚拟方法

#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; 
} 
+4

多态性仅适用于通过方法指针或引用调用。你基本上完成了'A tmp = b; cout << tmp.name()<< endl;'。 –

回答

6

static_cast<A>(b)创建从b构建A类型的临时变量。所以调用name()确实调用A::name()

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

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

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

对于预期的结果,如果你想使用指针,你所要做的是在主要如下:

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

为什么动态分配使事情复杂化? –

1

你所经历被称为切片。本质上,静态投将削减B部远离对象和你保持只是一个A.

What is object slicing?