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

Kyl*_*yle 2 c++ polymorphism containers stl

HI!任何人都知道如何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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢.

Ter*_*fey 5

你的问题很奇怪; 该主题询问"我如何将物品放入容器中而不会失去多态性" - 但这是在乞求这个问题; 容器中的项目不会丢失多态性.你只有一个基本类型的容器,一切正常.

从你的示例中,它看起来你问的是"如何将子指针容器转换为基指针容器?" - 答案就是,你做不到.子指针可以转换为基指针,子指针的容器不是.它们是不相关的类型.虽然,请注意,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();
    }
}
Run Code Online (Sandbox Code Playgroud)

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