На самом деле я новичок в C ++. Я попробовал что-то (на самом деле контейнер карт), но это не сработало так, как я предполагал ... Перед публикацией кода я вскоре объясню.
Я создал 3 класса:
ClassA
ClassDerivedA
ClassAnotherDerivedA
Два последних являются производными от "ClassA".
Далее я создал карту:
map<string,ClassA> test_map;
Я поместил некоторые объекты (из типов ClassDerivedA и ClassAnotherDerivedA) в карту. Имейте в виду: сопоставленное значение относится к типу "ClassA". Это будет работать только из-за полиморфизма. Наконец, я создал итератор, который работает над моей картой и сравнивает вводимые пользователем данные с моими ключами на карте. Если они совпадают, он вызовет определенный метод с именем "printOutput".
И есть проблема:
Хотя я объявил «printOutput» как «виртуальный», единственный вызванный метод - метод из моего базового класса, но почему?
и вот код:
#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;
}
}