以下案例指出切片问题: 在任务期间: https://stackoverflow.com/a/274634/640639
在函数调用期间: What is object slicing?
我的问题是,如果赋值运算符和复制构造函数被声明为虚拟的,并且派生类适本地复制了所需的数据,这两种情况都不会得到解决吗?如果是这样的话,原则上传递值在这些情况下应该仍然有效,对吗?
最佳答案
没有。参数按值传递,因此创建了一个新的基础对象。
没有虚构造函数这样的东西,因为virtual
的意思是“依赖于this
的动态类型”,并且在构造函数运行之前,对象甚至不存在,因此它不能具有派生的动态类型。
虚拟赋值运算符也无济于事,因为它们取决于被赋值对象的类型,而不是被赋值对象的类型。
如果您希望能够按值复制但仍然具有多态行为,您可以创建一个对象,该对象包含指向另一个对象的指针,并在其构造函数和赋值运算符中克隆该对象(使用类似于 value_ptr 的东西)来自 Martinho Fernandes 的 Wheels 图书馆):
class Base {
public:
virtual Base* clone() const = 0;
virtual void do_stuff() = 0;
};
class CopyablePolymorphic {
public:
CopyablePolymorphic(Base* base) : ptr(base) {}
private:
value_ptr<Base> ptr;
};
class Derived1 : public Base {
public:
virtual Base* clone() const {
return new Derived1(*this);
}
virtual void do_stuff() {
//Derived1 stuff
}
};
class Derived2 : public Base {
public:
virtual Base* clone() const {
return new Derived2(*this);
}
virtual void do_stuff() {
//Derived2 stuff
}
};
//etc...
关于c++ - 在继承的对象中切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14027372/