Предположим, я хочу создать иерархию, которая реагирует на определенное событие, закодированное в строке. Например команды, поступающие из сети. Идея заключается в том, что существует класс Base
, который обрабатывает сетевое подключение, приемный буфер, разделяет его и т. Д., А обработка реакции команд происходит в производном классе (производный класс также может добавлять некоторые новые слова для обработки). Поэтому мое решение:Метод метода производного класса формы заливки для базового класса
class Base {
public:
typedef void (Base::*Method)();
typedef std::unordered_map<std::string, Method> Methods;
void reactToA();
void reactToB();
Base() :
methods{
{ "A", &Base::reactToA },
{ "B", &Base::reactToB }
}
{
}
void action(const std::string &s)
{
auto f = methods.find(s);
if(f != methods.end())
(*this.*)(f->second)();
}
protected:
Methods methods;
};
class Child : public Base {
public:
void reactToB();
void reactToC();
Child() {
methods[ "B" ] = static_cast<Method>(&Child::reactToB);
methods[ "C" ] = static_cast<Method>(&Child::reactToC);
}
};
Так что я должен бросить указатель Child
метод указатель на Base
метода. Является ли это отличное определение? Есть ли более элегантный (или правильный, если это приводит к UB) решение?
Вам не нужно делать актеры, вы всегда будете использовать экземпляр для выполнения обратных вызовов. –
, поскольку написано 'Base' не является базовым классом' Child', это похоже на проблему, с которой надлежащее наследование будет работать даже без приведения. – YoungJohn
Да, вы изобретаете полиморфизм. Любая причина ? – Quentin