在下面的代码中,由于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;
}
答案 0 :(得分:6)
static_cast<A>(b)
创建一个由A
构造的b
类型的临时变量。因此,调用name()
确实会调用A::name()
。
为了观察您可能会做的多态行为
static_cast<A&>(b).name()
答案 1 :(得分:1)
您遇到的事情称为切片。基本上静态演员会将B部分从物体上切下来,而你只保留一个A.
答案 2 :(得分:0)
正如oliver Charlesworth在评论中提到的,你需要指针或参考看到多态性影响所需的对象。然后系统将识别对象的动态类型并调用相应的函数。 Anton Savin的答案解释了如何使用引用调用多态性。
对于预期结果,如果要使用指针,则必须在main中执行以下操作:
A *a= new B();
cout << a->name() << endl;