Приведение неверно, поскольку ваш код должен предполагать, что он будет вызван только для экземпляра класса Derived
. Это означает, что вы должны либо предположить, что все элементы в x
являются экземплярами Derived
(в этом случае объявление x
является общим и должно быть изменено на std::vector<void(Derived::*)(void)> x;
), либо вам необходимо сохранить дополнительную информацию, что какой метод класса хранится в определенной позиции x
. Оба подхода плохие.
В современном C ++ гораздо лучше сделать это так:
struct Base
{
std::vector<std::function<void()>> x;
};
struct Derived : public Base
{
void foo() {}
};
// ...
Derived d;
d.x.push_back([&d](){ d.foo(); });
Другим хорошим подходом может быть CRTP:
template<class T>
struct Base
{
std::vector<void(T::*)(void)> x;
};
struct Derived : public Base<Derived>
{
void foo() {}
};
// ...
Derived d;
d.x.push_back(&Derived::foo);