This question already has answers here:
What is object slicing?

(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