如何在指针的向量上实现派生类的复制构造函数到具有派生类实例的基类

How to implement a copy constructor of the derived class on a vector of pointers to base class which has instances of derived classes?

本文关键字:派生 构造函数 基类 实例 复制 向量 实现 指针      更新时间:2023-10-16

所以我有一个基类家具,它也是抽象的类,派生的班级床,桌子,椅子和桌子。我正在使用指针的矢量来进行基础家具,在那里我举行了派生类的实例。我还有另一个与家具矢量进行操作的班级收银机。我必须使用我所做的派生类的复制构造函数,而这个代码段的想法是让我以最安全的方式克隆在基类中保存在指针向量中的派生类对象可能的。所以这些是我的复制构造函数:

explicit Desk(const Desk& _desk) : Furniture(_desk),     numberOfDrawers(_desk.numberOfDrawers) {};
explicit Table(const Table& _table) : Furniture(_table), numberOfLegs(_table.numberOfLegs) {};
explicit Chair(const Chair& _chair) : Furniture(_chair), numberOfLegs(_chair.numberOfLegs) {};
explicit Bed(const Bed& _bed) : Furniture(_bed), size(_bed.size) {};

以及我到目前为止的想法是:

std::cout << "The object is found: " << furniture[index]->getName() << std::endl;
    std::cout << "Price:               " << furniture[index]->getPrice() << std::endl;
    std::cout << "Code:                " << furniture[index]->getCode() << std::endl;
    std::cout << "Do you want to copy the purchase of " << furniture[index]->getName() << " ? (Y/N)";
    char read;
    std::cin >> read;
    if (read == 'Y')
    {
        if (furniture[index]->getName() == "Bed") {
            Bed* deskClone = new Bed(dynamic_cast<Bed&>(*furniture[index]));
            furniture.push_back(deskClone);
        }
        if (furniture[index]->getName() == "Desk") {
            Desk* bedClone = new Desk(dynamic_cast<Desk&>(*furniture[index]));
            furniture.push_back(bedClone);
        }
        if (furniture[index]->getName() == "Table") {
            Table* tableClone = new Table(dynamic_cast<Table&>(*furniture[index]));
            furniture.push_back(tableClone);
        }
        if (furniture[index]->getName() == "Chair") {
            Chair* chairClone = new Chair(dynamic_cast<Chair&>(*furniture[index]));
            furniture.push_back(chairClone);
        }
    }

不幸的是,我读到这很危险,所以我想问一下是否有更好的方法可以解决这个问题?顺便说一句:这是我的第一个帖子的家伙不要太刻薄:D

向基类添加纯虚拟克隆功能,覆盖到处覆盖,然后用

代替整个条件汤
furniture.push_back(furniture[index]->clone());

如评论中所建议的

virtual Furniture* copy() = 0;

孩子的实施

class Bed
{
    ...
    virtual Furniture* copy() override
    {
       return new Bed(*this);
    }
    ...
};