gpt4 book ai didi

C++:如何将派生类的容器传递给需要其基类容器的函数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:23:12 26 4
gpt4 key购买 nike

嗨!任何人都知道如何使下面代码中的行“chug(derlist);”起作用?

#include <iostream>
#include <list>
using namespace std;

class Base
{
public:
virtual void chug() { cout << "Base chug\n"; }
};

class Derived : public Base
{
public:
virtual void chug() { cout << "Derived chug\n"; }
void foo() { cout << "Derived foo\n"; }
};

void chug(list<Base*>& alist)
{
for (list<Base*>::iterator i = alist.begin(), z = alist.end(); i != z; ++i)
(*i)->chug();
}

int main()
{
list<Base*> baselist;
list<Derived*> derlist;

baselist.push_back(new Base);
baselist.push_back(new Base);
derlist.push_back(new Derived);
derlist.push_back(new Derived);

chug(baselist);
// chug(derlist); // How do I make this work?

return 0;
}

我需要这个的原因基本上是,我有一个非常复杂对象的容器,我需要将其传递给某些只关心这些复杂对象中的一个或两个虚函数的函数。

我知道简短的回答是“你不能”,我真的在寻找人们用来解决这个问题的任何技巧/习语。

提前致谢。

最佳答案

你的问题很奇怪;主题问“如何在不丢失多态性的情况下将项目放入容器中”——但这是在回避问题;容器中的项目不会失去多态性。您只有一个基本类型的容器,一切正常。

从您的样本来看,您似乎在问“如何将子指针容器转换为基指针容器?” - 答案是,你不能。子指针可以转换为基指针,而子指针的容器则不能。它们是不相关的类型。虽然,请注意 shared_ptr 可转换为 shared_ptr,但这只是因为它们有额外的魔力来实现它。容器没有这样的魔力。

一个答案是让 chug 成为一个模板函数(免责声明:我的电脑上没有编译器,所以我没有尝试编译它):

template<typename C, typename T>
void chug(const C<T>& container)
{
typedef typename C<T>::iterator iter;
for(iter i = container.begin(); i < container.end(); ++i)
{
(*i)->chug();
}
}

然后 chug 可以采用任何类型的任何容器,只要它是指针的容器并且具有 chug 方法即可。

关于C++:如何将派生类的容器传递给需要其基类容器的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2376334/

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