假设我有一些课程
Class Alpha(基类)
Class Beta(Subclass Alpha)
Class Delta(Subclass Alpha)
是否可以在该向量中创建一个vector<Alpha>
并存储Alpha,Beta和Delta类型的对象实例,并使向量函数正常?
如果没有,假设我想拥有某种类似的功能,那么最好的方法是什么?
答案 0 :(得分:3)
这样做的一种方法是使用一个充满指针的向量,并使它们中的每一个共有的函数在基类中为virtual
:
class Alpha {
public:
virtual void dosomething() { /* do something as an alpha */ }
};
class Beta : public Alpha {
public:
void dosomething() { /* do something as a beta */ }
};
class Delta : public Alpha {
public:
void dosomething() { /* do something as a delta */ }
};
vector<Alpha*> v;
v.push_back(new Alpha);
v.push_back(new Beta);
v.push_back(new Delta);
v[1]->dosomething(); // calls Beta's dosomething
但是,您必须小心这种方法,以确保delete
将new
放入容器中的所有内容。你可以使用智能指针并避免这个警告:
vector<shared_ptr<Alpha> > v;
v.push_back(shared_ptr<Alpha>(new Alpha));
v.push_back(shared_ptr<Alpha>(new Beta));
v.push_back(shared_ptr<Alpha>(new Delta));
v[1]->dosomething(); // still calls Beta's dosomething
你不希望有Alpha
s(而不是Alpha*
s的向量,这是正常的)是因为STL容器复制你给它们的值,如果你复制将Beta
(或Delta
)作为Alpha
,只会调用Alpha
的复制构造函数,并且结果信息必须符合{{Alpha
的大小1}}(如果你已经向子类中添加了任何信息,它将不够大),Beta
(或Delta
)所带来的额外信息就会丢失。这称为切片。
答案 1 :(得分:1)
最好的方法是将智能指针存储到向量中的类。
你不能通过值传递,因为你随后会切片。
如果您通过引用传递,则可能有变量超出范围。
std::vector<shared_ptr<Alpha> > blah;