выполняет методы для производного объекта.
Таким образом, вы должны иметь дескриптор производного объекта при выполнении методов. И два метода не в Base::
, потому что они не внутри Base
. Они находятся внутри Derived
, поэтому указатели могут быть Derived::*
, но это не имело бы смысла и нарушало бы модель, которую, я думаю, вы хотите иметь. Я думаю, вы могли бы сделать ваши методы g
h
и f
виртуальными внутри Base
. Но это опять же, победив цель, я полагаю, паттерн типа «наблюдатель-я» sh.
То, что вы хотите сделать, в основном легко решается с помощью правильной абстракции - std::function
и std::bind
.
#include <iostream>
#include <array>
#include <functional>
class Base {
std::array<std::function<void()>, 3> actions;
public:
void setAction(int a, std::function<void()> act) {
actions.at(a) = act;
}
void f() { std::cout << "f"; }
void go() {
for (auto&& action : actions) {
if (action) {
action();
}
}
}
};
struct Derived : public Base {
void g() { std::cout << "g"; }
void h() { std::cout << "h"; }
Derived() {
setAction(1, std::bind(&Derived::f, this));
setAction(2, std::bind(&Derived::g, this));
setAction(1, std::bind(&Derived::h, this));
}
};
int main() {
Derived d;
d.go();
}