This question already has an answer here:
C++ Polymorphism and Vectors, pointing a derived class of vectors to a base class of vectors

(1个答案)


1年前关闭。




我试图理解为什么我不能将派生类类型的列表传递给定义为获取基类类型的列表作为参数的函数。
#include <iostream>
#include <list>
using std::list;
class foo {

};

class bar : foo {

};
static void print_all(list<foo*> &L) {

}
void main() {
    list<foo*> LF;
    list<bar*> LB;
    print_all(LB); // error
    print_all(LF); // works fine
}

提前致谢。

最佳答案

因为是模板,所以std::list<foo*>std::list<bar*>是完全不相关的类型。但是,即使这与模板无关(您可以尝试通过继承显式安装这样的关系),也有很好的理由说明为什么它仍然不能很好地工作(假设这是合法的……):

void f(std::list<foo*>& l)
{
    l.push_back(new foo());
}

void g()
{
    std::list<bar*> l;
    f(l);
    // now l contains a foo object that is not a bar one!!!
}

顺便说一句:您是否曾经注意到C++ STL从未将容器传递给函数?您可以尝试相同的方法:
template <typename Iterator>
void print_all(Iterator begin, Iterator end)
{
    for(; begin != end; std::advance(begin))
    {
        // print *begin
    }
}

print_all(lf.begin(), lf.end());
print_all(lb.begin(), lb.end());

07-28 06:54