关于C ++类型和向量

时间:2011-08-20 02:40:31

标签: c++ oop vector subclassing

假设我有一些课程

Class Alpha(基类)

Class Beta(Subclass Alpha)

Class Delta(Subclass Alpha)

是否可以在该向量中创建一个vector<Alpha>并存储Alpha,Beta和Delta类型的对象实例,并使向量函数正常?

如果没有,假设我想拥有某种类似的功能,那么最好的方法是什么?

2 个答案:

答案 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

但是,您必须小心这种方法,以确保deletenew放入容器中的所有内容。你可以使用智能指针并避免这个警告:

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;