我有一个基本结构FooBase
:
struct FooBase { };
然后创建一个模板结构
Foo
,它是FooBase
的子级:template <typename typeName> struct Foo : public FooBase { typeName* foo };
在某些类中,我创建一个
FooBase
的向量,并在其中添加Foo
的实例:vector <FooBase> FooVector
...
Foo <Bar> fooInstance;
fooInstance.foo = new Bar();
FooVector.push_back ( fooInstance );
然后我需要访问存储的数据,但是关于
foo
中缺少成员FooBase
的问题,我得到了可预见的明显错误FooVector[0].foo
我不能写这样的东西
Foo <Bar> fooInstance = FooVector[0]
因为我不知道template参数。
如何在向量中存储
Foo
的实例,以便以后可以访问它们。请注意,从向量中读取数据时,我不知道最后一步的template参数。附言不允许提升!
最佳答案
在这里发生的是
FooVector.push_back ( fooInstance );
一行,C ++静默调用
FooBase
的副本构造函数,因为您只能将这种类型的对象保留在向量中。由于Foo
是从FooBase
公开继承的,因此可以使用类型为FooBase::FooBase(FooBase const&)
的对象调用方法Foo
。因此,您并不是真正存储
Foo
,而是实际上存储了FooBase
。要执行您想做的事情,您需要一个std::vector<FooBase*>
或std::vector<std::shared_ptr<FooBase> >
。但是,向量的内容仍然缺少
foo
成员,因为静态类型仍然不是Foo
。为了解决这个问题,您有一些选择。您可以将dynamic_cast
static_cast
或FooBase*
放入Foo*
,然后访问其foo
成员。但这可能会中断,因为FooBase*
指针实际上可能包含Foo
以外的其他类型。为什么不只使用
std::vector<Foo<Bar> >
呢?