C++ 无法在C+;中将_back()派生类推送到STL列表中+;

C++ 无法在C+;中将_back()派生类推送到STL列表中+;,c++,gcc,stl,abstract-class,C++,Gcc,Stl,Abstract Class,我将非常感谢您的帮助 问题是我无法成功地将某些内容推回到STL列表中。 详情如下: Fo是一个抽象类,Foo是从Fo继承的类。 f0,f1是类Foo的实例。 dublist具有类型std::list和foList具有类型std::list 当我尝试傻瓜时,向后推(f1)我可以cout成员p的值,但不能调用函数test(); 当我尝试开本时,向后推(&f1)I甚至不能cout成员p的值,更不用说调用函数test() 注释了错误为-1/2/3的行后,我获得了输出: Fo constructor Fo

我将非常感谢您的帮助

问题是我无法成功地将某些内容推回到STL列表中。 详情如下:

Fo
是一个抽象类,
Foo
是从
Fo
继承的类。
f0
f1
是类
Foo
的实例。
dublist
具有类型
std::list
foList
具有类型
std::list

当我尝试
傻瓜时,向后推(f1)
我可以
cout
成员
p
的值,但不能调用函数
test()
; 当我尝试
开本时,向后推(&f1)
I甚至不能
cout
成员p的值,更不用说调用函数
test()

注释了错误为-1/2/3的行后,我获得了输出:

Fo constructor
Foo constructor
Fo constructor
Foo initialization 
Fo constructor
Foo copy constructor
inside fooList :11
------------------------
我还意识到
foolist.push_back(&f1)
没有调用
Foo
copy构造函数, 这可能与错误2有关

当我试图调用
dublist
中的函数
test()
时,我得到一条错误消息:

error: member function 'test' not viable: 'this' argument has type
  'const Foo', but function is not marked const
error: no member named 'p' in 'Fo'
当我尝试在
文件夹中查找成员p时,我得到一个错误消息:

error: member function 'test' not viable: 'this' argument has type
  'const Foo', but function is not marked const
error: no member named 'p' in 'Fo'
我不知道如何解决这个问题

非常感谢

完整代码列表如下:

#include <iostream>
#include <list>

class Fo
{
public:
    Fo() { std::cout << "Fo constructor" << std::endl; }
    Fo(const Fo& f) { std::cout << "Fo copy constructor" << std::endl; }
    virtual ~Fo(){};
    virtual void test()=0;
};

class Foo : public Fo
{
public:
    int p;
    Foo() { std::cout << "Foo constructor" << std::endl; }
    Foo(int p_): p(p_) {std::cout << "Foo initialization " << std::endl;};
    Foo(const Foo& f) { this->p = f.p; std::cout << "Foo copy constructor" << std::endl; }
    virtual void test() {std::cout<<"testing Foo ... "<<std::endl;}
};

int main() {
    Foo f0,f1(11);

    std::list<Foo> fooList;
    std::list<Foo>::const_iterator i=fooList.begin();
    fooList.push_back(f1);i++;
    std::cout << "inside fooList :" << i->p << std::endl;
    //std::cout<<"inside fooList :"<<i->p<<" and "<<i->test();  // error-1
    std::cout << "------------------------" << std::endl;

    std::list<Fo*> foList;
    std::list<Fo*>::const_iterator it=foList.begin();
    foList.push_back(&f1);it++;
    //std::cout<<(*it)->p<<std::endl;  // error-2
    //std::cout<<"inside foList :"<<(*it)->p<<" and "<<it->test();  // error-3

    return 0;
}
#包括
#包括
Fo类
{
公众:
Fo(){std::cout修复

//std::cout<<"inside fooList :"<<i->p<<" and "<<i->test();  // error-1

//std::cout简单的回答是,如果你在进行派生,你需要存储指针,而不是对象。一个基本对象的容器只能保存基本对象,而不是派生对象。如果你修复了一些问题,这样代码就可以编译了,那么最好的方法就是“切片”,这意味着派生对象的实例实际上已转换为基类对象,而这些转换后的基类对象就是存储在列表中的对象。这不起作用,因为对象是复制的,容器实际上只存储声明类型的对象。顺便说一句:如果要“证明”在构造函数和析构函数中使用该输出的任何东西,都会缺少一些,请查看所谓的“三定律”。我想知道这些错误消息有什么不清楚的地方。它们确切地说明了问题所在。我明白了错误-2的意思。我需要进行类型转换。但是按照您的方式,编译器仍然显示错误-1的错误消息。如果您的代码中出现更多错误,请更改test()的返回类型从两个位置的void到int,chande const_iterator到两个位置的iterator,并在error-3处将其->test()更改为(*it)->test()。现在它可以工作了。而且似乎没有必要用iterator替换const_iterator。您能告诉我为什么返回类型在这里很重要吗?谢谢。这是单独问题的主题/简短地说'
//std::cout<<(*it)->p<<std::endl;  // error-2
std::cout<<(Foo*(*it))->p<<std::endl;  // error-2
//std::cout<<"inside foList :"<<(*it)->p<<" and "<<it->test();  // error-3
//std::cout<<"inside foList :"<<(Foo*(*it))->p<<" and "<<it->test();  // error-3