Мне кажется совершенно безопасным приведение void(Derived::*)()
к void(Base::*)()
, как в этом коде:
#include <iostream>
#include <typeinfo>
using namespace std;
struct Base{
void(Base::*any_method)();
void call_it(){
(this->*any_method)();
}
};
struct Derived: public Base{
void a_method(){
cout<<"method!"<<endl;
}
};
int main(){
Base& a=*new Derived;
a.any_method=&Derived::a_method;
a.call_it();
}
Но компилятор жалуется на приведение в a.any_method=&Derived::a_method;
. Является ли это препятствием для предотвращения незаметных ошибок программирования или просто чем-то, что облегчает жизнь разработчикам компиляторов? Существуют ли обходные пути, позволяющие классу Base
иметь указатель на функции-члены Derived
без знания типа (то есть я не могу сделать Base
шаблоном с аргументом шаблона Derived
).