C++中的静态映射和虚拟方法

C++中的静态映射和虚拟方法,c++,virtual,static-cast,C++,Virtual,Static Cast,在下面的代码中,由于名称是虚拟的,我希望将调用派生结构的方法。相反,写出来的是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; c

在下面的代码中,由于名称是虚拟的,我希望将调用派生结构的方法。相反,写出来的是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;

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

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

A *a= new B();
cout << a->name() << endl;
static_castb创建一个由b构造的类型为a的临时变量。所以调用name确实调用了::name

为了观察多态性行为,您可以

static_cast<A&>(b).name()
static_castb创建一个由b构造的类型为a的临时变量。所以调用name确实调用了::name

为了观察多态性行为,您可以

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

你正在经历的是所谓的切片。基本上,静态投射将从对象上切下B部分,而您只保留A部分


你正在经历的是所谓的切片。基本上,静态投射将从对象上切下B部分,而您只保留A部分


多态性仅适用于通过指针或引用进行的方法调用。你基本上做了一个tmp=b;cout多态性仅适用于通过指针或引用进行的方法调用。你基本上做了一个tmp=b;为什么不能用动态分配使事情复杂化?为什么用动态分配使事情复杂化?