c ++:vector <base />是否包含Derived类型的对象?

时间:2012-08-09 17:52:56

标签: c++ vector polymorphism object-slicing

标题几乎说明了一切。基本上,这样做是合法的:

class Base {
    //stuff
}

class Derived: public Base {
    //more stuff
}

vector<Base> foo;
Derived bar;
foo.push_back(bar);

基于我见过的其他帖子,以下是可以的,但我不想在这种情况下使用指针,因为它更难使线程安全。

vector<Base*> foo;
Derived* bar = new Derived;
foo.push_back(bar);

3 个答案:

答案 0 :(得分:14)

不,Derived个对象将是sliced:所有其他成员都将被丢弃。

使用std::vector<std::unique_ptr<Base> >

代替原始指针

答案 1 :(得分:4)

它是合法但遭受对象切片的影响。基本上,您将拥有Base个对象的向量。没有多态性,派生对象的类型信息将会丢失......就好像你只是将Base个对象添加到向量中一样。

您可以改用智能指针。

答案 2 :(得分:1)

vector<Base> foo;
Derived bar;
foo.push_back(bar);

这等于推送Base对象,因为push_back声明如下:

void push_back ( const T& x );

因此,编译器将进行隐式降级转换并复制到向量内存池中。 不,不能在Derived内包含vector<Base>。它们将是Base

如果您向Base添加一些虚拟功能,然后在Derived中覆盖它,创建Derived对象,将其推入vector<Base>,然后从vector的新对象中调用它,您将看到Base实现被称为