gpt4 book ai didi

c++ - 将派生对象存储到基类型的容器中

转载 作者:行者123 更新时间:2023-11-28 07:32:58 27 4
gpt4 key购买 nike

我有一些基本问题要理解在 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;
}

最佳答案

不能将派生对象存储在基类的 std::vector 中。试着记住这一点。

那个 vector 存储基类,没有别的。在 push_back 上,派生部分被切掉。

如果您想要一个多态集合,请查看如何实现,“多态 STL 集合”在 SO 上或一般情况下都是很好的查询。

关于c++ - 将派生对象存储到基类型的容器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17294909/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com