我在一个大型系统中遇到一个不寻常的问题,由于各种原因我可能不得不使用这样的结构:
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
我意识到这里存在设计缺陷,例如指针所有权的混乱转移,但是如果您需要复制的数据主要包含在基类类中,那么初始化具有基类版本的派生类对象被认为是非常糟糕的形式基类,但是您需要仅在派生类中支持的特定功能吗?非常感谢。
答案 0 :(得分:2)
通过这种设计,您可以在类层次结构中获得“横向转换”,例如
void foo(ItemExtension const&)
class OtherItemExtension: public Item { /* ... */ };
OtherItemExtenstion bar;
foo(bar);
此处通过foo
创建一个临时ItemExtension
并将其传递给bar
,对foo
的调用成功。最有可能的不是你想要的。
请注意,即使您将构造函数设为显式,以下内容仍会成功:
ItemExtension baz(bar);
你很可能不希望这样,让这个构造函数成为一个坏主意。