需要地图(c+;+;,STL)方面的帮助 实际上,我对C++是新的。我尝试了一些东西(实际上是地图容器),但它没有像我想象的那样工作。。。在发布我的代码之前,我将很快解释它

需要地图(c+;+;,STL)方面的帮助 实际上,我对C++是新的。我尝试了一些东西(实际上是地图容器),但它没有像我想象的那样工作。。。在发布我的代码之前,我将很快解释它,c++,stl,map,polymorphism,C++,Stl,Map,Polymorphism,我创建了3个类: 甲级 ClassDerivedA 克拉斯诺特维达酒店 最后两个来自“ClassA” 此外,我还创建了一张地图: map<string,ClassA> test_map; map测试图; 我将一些对象(来自ClassDerivedA和ClassAnotherDerivedA类型)放入地图中。请记住:映射的值来自类型“ClassA”。这只会因为多态性而起作用。最后,我创建了一个迭代器,它运行在我的映射上,并将用户输入与映射中的键进行比较。如果它们匹配,它将调用一

我创建了3个类:

甲级 ClassDerivedA 克拉斯诺特维达酒店

最后两个来自“ClassA”

此外,我还创建了一张地图:

  map<string,ClassA> test_map;
map测试图;
我将一些对象(来自ClassDerivedA和ClassAnotherDerivedA类型)放入地图中。请记住:映射的值来自类型“ClassA”。这只会因为多态性而起作用。最后,我创建了一个迭代器,它运行在我的映射上,并将用户输入与映射中的键进行比较。如果它们匹配,它将调用一个名为“printOutput”的特定方法

问题是: 虽然我将“printOutput”声明为“virtual”,但唯一调用的方法是来自基类的方法,但是为什么呢? 代码如下:

#include <iostream>
#include <map>

using namespace std;

class ClassA
{
    public:
        virtual void printOutput() { cout << "ClassA" << endl;      }
};

class ClassDerivedA : public ClassA
{
    public:
        void printOutput() { cout << "ClassDerivedA" << endl;       }
};

class ClassAnotherDerivedA: public ClassA
{
    public:
        void printOutput() { cout << "ClassAnotherDerivedA" << endl;        }
};

int main()
{
    ClassDerivedA class_derived_a;
    ClassAnotherDerivedA class_another_a;


  map<string,ClassA> test_map;
    test_map.insert(pair<string,ClassA>("deriveda", class_derived_a));
    test_map.insert(pair<string,ClassA>("anothera", class_another_a));

    string s;

    while( cin >> s )
    {
    if( s != "quit" )
    {
        map<string,ClassA>::iterator it = test_map.find(s);
      if(it != test_map.end())
        it->second.printOutput();
    }
    else
      break;
    }

}
#包括
#包括
使用名称空间std;
甲级
{
公众:

virtual void printOutput(){coutC++不是Java。不能在基类型的变量中存储派生类型。例如:

Base b = Derived();
将仅将派生类的基部分存储在变量b中。为了获得多态行为,您需要使用指针,并动态创建派生类:

Base * b = new Derived();

C++容器同样如此——您需要:

map <string, Base *> m;
map-m;

所有这些都应该包含在每一个介绍性C++文本中——你使用哪一个?

< p>问题。你在你的地图中存储<代码> ClassA < /Cord>值。当你将派生类实例存储到地图中时,get被分割成<代码> ClassA < /Cord>对象。你需要在你的映射中存储指针而不是值。 有关切片的详细信息,请参见此:

您正在体验“”。要使虚拟函数正常工作,您需要使用指针或引用调用它们。换句话说,您的
映射应包含指向
ClassA
的指针:

map测试\u map

完成后,请记住删除它们,或使用智能指针


以下是有关切片的详细信息:,并且

请记住,在使用地图时,您还需要删除地图条目指向的对象。如果地图在派生对象之前被销毁,那么这些派生对象就是内存泄漏!谢谢!我正在读的书(德语版)没有深入到STL,但告诉了所有基本的东西。我理解错了一些东西,但我知道这对我来说很清楚!作为一个补充,你可以使用make_pair()而不是pair(),更不用说写了…现在就行了!我误解了一些东西:多态性(在C++中)只适用于指针(如Neil Butterworth所说)。多谢大家!多态性可用于指针或引用,但不能在容器中使用引用。因此,在这种情况下,您必须使用某种类型的指针。如Dima所建议的,使用智能指针将是一个好主意。一个好的选择可能是从Boost或TR1共享。