9

标题基本概括了所有内容。基本上,这样做是否合法:

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);
4

3 回答 3

15

不,Derived对象将被切片:所有其他成员都将被丢弃。

而不是原始指针,使用std::vector<std::unique_ptr<Base> >.

于 2012-08-09T17:55:45.070 回答
4

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

您可以改用智能指针。

于 2012-08-09T17:54:54.890 回答
1
vector<Base> foo;
Derived bar;
foo.push_back(bar);

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

void push_back ( const T& x );

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

如果您添加一些虚函数,Base然后在其中覆盖它Derived,创建Derived对象,将其推入vector<Base>,然后从向量的新对象中调用它,您将看到Base调用了实现

于 2012-08-09T18:06:04.267 回答