的载体请看下面的例子代码:C++问题多态性和指针
class Foo
{
};
class Bar : public Foo
{
};
class FooCollection
{
protected:
vector<shared_ptr<Foo> > d_foos;
};
class BarCollection : public FooCollection
{
public:
vector<shared_ptr<Bar> > &getBars()
{
// return d_foos won't do here...
}
};
我有这样一个问题,我目前的项目。客户端代码使用BarCollection
,它存储指向Bars
的指针d_foos
,该指针在FooCollection
中声明。我现在想要将指向Bars的指针集合暴露给客户端代码。我可以让客户端代码访问指向Foo
s的指针矢量,并在客户端代码中将这些指针指向Bar
s,但由于客户端不需要知道Foo
的存在,因此感觉错误。
我也可以定义一个get()
成员,它从d_foos
中检索对象并投射它们,但是这种感觉很笨拙。最好,我想只是返回d_foos作为vector<shared_ptr<Bar> > &
,但我似乎无法做到这一点。
也可能是我的设计显然是错的。尽管这似乎是最自然的解决方案,因为Bar
是Foo
的专业化版本,而BarCollection
是FooCollection
的专业版本,它们共享功能。
你能提出一个很好的解决方案来实施getBars
BarCollection
或更好的设计方案吗?
编辑:
原来我的设计是坏确实如此。尽管需要所有FooCollection的功能,但BarCollection不是FooCollection。这是很多清洁 - - 我基于下面的答案,目前的解决方案是现在:
class Foo
{
};
class Bar : public Foo
{
};
template<class T>
class Collection
{
vector<shared_ptr<T> > d_items;
};
typedef Collection<Foo> FooCollection;
class BarCollection : public Collection<Bar>
{
// Additional stuff here.
};
感谢所有的很好的建议和例子!
我已经发布了一个解决方案...主要是为了完整,但因为它涉及'reinterpret_cast'。我强烈建议你考虑重构的选择。尤其是,您将继承引入的“IS-A”关系与代码重用混为一谈。 此外,你不想在那里有'getBars'。暴露你的私人部分被视为暴露主义并受到法律惩罚。 – 2009-11-16 13:07:52
@Matthieu:我已经为这个问题添加了我重构的当前解决方案。谢谢! – 2009-11-16 13:23:10