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

时间:2016-06-21 11:26:03

标签: c++

所以我有一个基类Furniture,它也是一个抽象类,派生类Bed,Table,Chair和Desk。我正在使用指向基类Furniture的指针向量,并且在那里我保存派生类的实例。我有另一个类收银机,它使用家具载体进行操作。我必须使用我所创建的派生类的复制构造函数,并且使用这段代码的想法是为了克隆派生类对象,该对象保存在基类中的指针向量中,以最安全的方式可能。 所以这些是我的副本构造函数:

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

2 个答案:

答案 0 :(得分:0)

将纯虚拟克隆功能添加到基类,覆盖所有地方,并用

替换整个条件汤
mvn clean package

答案 1 :(得分:0)

正如评论中所建议的那样,在基类中创建一个虚函数

virtual Furniture* copy() = 0;
孩子们实施的

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