This question already has answers here:
What is object slicing?
(18个回答)
在6个月前关闭。
到目前为止,我已经完成了以下工作:
我这样使用它:
实际输出如下:
转换为基类的类型不起作用。我做错什么了。
有没有办法使覆盖有效,还可以确保按值复制对象。
两者都可以。但要提防生命周期:一旦
(18个回答)
在6个月前关闭。
到目前为止,我已经完成了以下工作:
class Stamp{
public:
virtual std::string GetStampName() const { return "undefined"; }
};
class FooStamp : public Stamp {
public:
std::string GetStampName() const override { return "foo-stamp"; }
};
我这样使用它:
FooStamp fooStamp;
std::cout << "foo-stamp:" << fooStamp.GetStampName() << std::endl;
const Stamp stamp = fooStamp;
std::cout << "stamp:" << stamp.GetStampName() << std::endl;
实际输出如下:
foo-stamp:foo-stamp
stamp:undefined // expected: foo-stamp
转换为基类的类型不起作用。我做错什么了。
有没有办法使覆盖有效,还可以确保按值复制对象。
最佳答案
您正在体验object slicing,因为FooStamp
对象不适合Stamp
对象,因此将其复制会切掉子类部分。
运行时多态性需要使用引用或指针:
Stamp const& stamp = fooStamp;
std::cout << "stamp:" << stamp.GetStampName() << "\n";
Stamp const* pstamp = & fooStamp;
std::cout << "stamp:" << pstamp->GetStampName() << "\n";
两者都可以。但要提防生命周期:一旦
fooStamp
超出范围,对它的指针和引用也应这样做。08-16 01:50