Не вызывается метод в классе, который наследует другой
Всем привет. Не могу понять, почему мой код не работает так как задумано.
Собственно, вот сам код:
Класс EventManager:
vector<Event> EventManager::getEvents() {
return events;
}
void EventManager::addEvent(const Event& e) {
if (!eventExists(e)) {
events.push_back(e);
}
}
bool EventManager::eventExists(Event e) {
for (Event ev : events) {
if (ev.getName() == e.getName()) {
return true;
}
}
return false;
}
Класс EventHelper:
void EventHelper::onConsoleMessage(string message) {
for (Event e : EventManager::getEvents()) {
e.onConsoleMessage(message);
}
}
Класс Event:
Event::Event(string name) {
this -> name = move(name);
}
void Event::onConsoleMessage(const string& message) {
}
string Event::getName() {
return name;
}
Ну и сам класс, который наследует класс Event:
ConsoleMessageEvent::ConsoleMessageEvent() : Event("test") {
}
void ConsoleMessageEvent::onConsoleMessage(const string &message) {
std::cout << "test10" << std::endl;
}
Все работает замечательно, но по какой-то из причин не хочет выполняться метод, во время его вызова через EventHelper.
Сам вызов:
int main() {
EventManager::addEvent(ConsoleMessageEvent());
log("Test");
return 0;
}
void log(const string& message) {
EventHelper::onConsoleMessage(message);
cout << message << endl;
}
По задумке должно выводить сообщение test10 после использования метода log в классе main.cpp. На java такой код прекрасно работает. В C++ совсем новичок, так что прошу объяснить где я допустил ошибку. И еще у меня есть вопрос: какая есть альтернатива Map и List в C++, по поводу списка List нашел инфу про vector, но думаю, что есть вариант куда удобнее. При необходимости могу прикрепить .h файлы (Не был уверен, что они тут пригодятся, так что прикрепил только .cpp).
Класс Event.h:
class Event {
private:
string name;
public:
explicit Event(string name);
string getName();
virtual void onConsoleMessage(const string& message);
};
Класс ConsoleMessageEvent.h:
class ConsoleMessageEvent : public Event {
public:
ConsoleMessageEvent();
void onConsoleMessage(const string &message) override;
};
Попытался сделать в другом проекте и итог такой же, метод попросту не вызывается.
#include <iostream>
#include <utility>
#include "vector"
using namespace std;
class Event {
private:
string name;
public:
explicit Event(string name) {
this -> name = move(name);
}
virtual void onTest(const string& message) {
}
};
class Test : public Event {
public:
Test() : Event("test") {
}
void onTest(const string &message) override {
cout << "Log message: " + message << endl;
}
};
int main() {
vector<Event> t;
t.push_back(Test());
t[0].onTest("testMsg");
return 0;
}
Ответы (1 шт):
Метод onConsoleMessage должен быть виртуальный:
virtual void Event::onConsoleMessage(const string& message);
и переопределен в ConsoleMessageEvent
virtual void Event::onConsoleMessage(const string& message) override;
Тогда будет использован метод производного класса.
В С++ используется std::list std::map std::vector.