Копировать конструкторское копирование экземпляра базового класса в производный класс - PullRequest
0 голосов
/ 21 февраля 2012

У меня необычная проблема в большой системе, где по разным причинам мне, возможно, придется использовать такую ​​конструкцию:

class Item
{
    int mID;
    int mID2;
    ...
    int mIDn;

public:
    Item();
    Item(const Item& Other);
    Item& operator=(const Item &Other);
};

class ItemExtension : public Item
{
     // some data
public:
     ItemExtension(const Item &Other) : Item(Other) {}
     ItemExtension(const ItemExtension &Other);
     ItemExtension& operator=(const ItemExtension& Other);
};


// client code
Item *Myitem = ItemList.ReleaseItem(index); // ownership transferred and an Item is removed from a list

std::auto_ptr<ItemExtension> ItemExt(new ItemExtension(*MyItem));
ItemExtList.push_back(ItemExt.release()); // store in std::vector and take ownership

Я понимаю, что здесь есть недостатки проектирования, такие как хаотическая передача указателявладение, но считается ли это действительно плохой формой для инициализации объекта производного класса с версией базового класса, если данные, которые необходимо скопировать, преимущественно содержатся в базовом классе, но вам нужны специальные функции, которые поддерживаются только в производном классе?Большое спасибо.

1 Ответ

2 голосов
/ 21 февраля 2012

С этим дизайном вы получаете «боковое преобразование» в иерархии классов, например,

void foo(ItemExtension const&)

class OtherItemExtension: public Item { /* ... */ };
OtherItemExtenstion bar;

foo(bar);

Здесь вызов foo завершается успешно созданием временного ItemExtension из bar и передачей его foo. Скорее всего, это не то, что вы хотите.

Обратите внимание, что даже если вы сделаете конструктор явным, следующее все равно выполнится успешно:

ItemExtension baz(bar);

Скорее всего, вы этого не хотите, потому что иметь этот конструктор - плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...