接收到派生类列表的方法的调用未在C ++中编译

时间:2018-12-14 08:23:14

标签: c++ inheritance

我试图理解为什么我不能将派生类类型的列表传递给定义为获取基类类型的列表作为参数的函数。

#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
}

谢谢。

2 个答案:

答案 0 :(得分:4)

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());

答案 1 :(得分:1)

如果您的目的只是打印来自foobar的信息,则不需要两个列表,可以有一个列表,其基类指针({ {1}}的指针)和一个foo的{​​{1}}函数。

然后您的代码将是:

print

请参见demo