标题几乎说明了一切。基本上,这样做是合法的:
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);
答案 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
实现被称为