c++ - 在继承的对象中切片

标签 c++ virtual copy-constructor assignment-operator object-slicing

以下案例指出切片问题: 在任务期间: 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/

相关文章:

c++ - 智能指针与初始值设定项列表混淆

c++ - C++17 静态内联成员的编译器错误

c++ - Android 服务器最佳实践

c++ - 如何在 SQLite 中插入新行 ("\n") 字符?

python ,Windows 10 : launching an application on a specific virtual desktop environment (work-spaces)

php - 以编程方式将 Woocommerce 购物车项目从虚拟更改为物理

c++ - 智能指针类的简单实现

c++ - 替代 C++ Web 服务客户端库

c++ - 抽象类继承另一个具有相同函数名的抽象类

c++ - 复制构造函数和动态分配