需要地图(c+;+;,STL)方面的帮助 实际上,我对C++是新的。我尝试了一些东西(实际上是地图容器),但它没有像我想象的那样工作。。。在发布我的代码之前,我将很快解释它
我创建了3个类: 甲级 ClassDerivedA 克拉斯诺特维达酒店 最后两个来自“ClassA” 此外,我还创建了一张地图:需要地图(c+;+;,STL)方面的帮助 实际上,我对C++是新的。我尝试了一些东西(实际上是地图容器),但它没有像我想象的那样工作。。。在发布我的代码之前,我将很快解释它,c++,stl,map,polymorphism,C++,Stl,Map,Polymorphism,我创建了3个类: 甲级 ClassDerivedA 克拉斯诺特维达酒店 最后两个来自“ClassA” 此外,我还创建了一张地图: map<string,ClassA> test_map; map测试图; 我将一些对象(来自ClassDerivedA和ClassAnotherDerivedA类型)放入地图中。请记住:映射的值来自类型“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共享。