我有一些基本的问题需要理解在C ++中将派生对象存储到基类型容器中的行为。
任何人都可以解释下面代码的输出吗?我认为两种功能中的行为都应该相同。
// Output
test_func1
UseCount: 1
UseCount: 2
test_func2
UseCount: 1
UseCount: 1 // Why???
class base_class
{
public:
base_class() { }
virtual ~base_class() { }
};
class derived_class : public base_class
{
public:
derived_class(const std::shared_ptr<int>& i)
: base_class(),
i_(i)
{ }
~derived_class() { }
private:
std::shared_ptr<int> i_;
};
void test_func1()
{
std::cout << "test_func1" << std::endl;
std::vector<derived_class> v;
std::shared_ptr<int> i(new int(100));
std::cout << "UseCount: " << i.use_count() << std::endl;
v.push_back(derived_class(i));
std::cout << "UseCount: " << i.use_count() << std::endl;
}
void test_func2()
{
std::cout << "test_func2" << std::endl;
std::vector<base_class> v;
std::shared_ptr<int> i(new int(100));
std::cout << "UseCount: " << i.use_count() << std::endl;
v.push_back(derived_class(i));
std::cout << "UseCount: " << i.use_count() << std::endl;
}
int main(int argc, char *argv[])
{
test_func1();
test_func2();
return 0;
}
答案 0 :(得分:1)
你不能在基类的std :: vector中存储派生对象。试着记住这一点。
该向量存储基类,没有别的。在push_back上,派生的部分被切掉。
如果你想拥有一个多态集合,请查看如何做到这一点,'多态STL集合'在SO或一般情况下是一个很好的查询。
答案 1 :(得分:0)
因为在第二种情况下,您的基类是从传递给push_back
方法的派生类复制构造的。并且您的基类不存储shared_ptr<int>
。在push_back
返回后,派生类实例被销毁。
void test_func2()
{
std::cout << "test_func2" << std::endl;
std::vector<base_class> v;
std::shared_ptr<int> i(new int(100)); //use count is 1
std::cout << "UseCount: " << i.use_count() << std::endl;
v.push_back(derived_class(i)); //base_class is copy constructed here and store in v
//derived_class() is destroyed ans use count is still 1
std::cout << "UseCount: " << i.use_count() << std::endl;
}