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