To me it looks perfectly safe to cast a void(Derived::*)() to a void(Base::*)(), like in this code:
#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();
}
But the compiler complains about the cast at a.any_method=&Derived::a_method;. Is this a roadblock to prevent subtle programming errors, or just something to make life easier for compiler writers? Are there workarounds to let the Base class have a pointer to member functions of Derived without type knoweledge (that is, I cannot make Base a template with template argument Derived).
What happens if your
Derived::a_method()attempts to use a data member only present inDerived, not inBase, and you call it on aBaseobject (or an object derived fromBasebut not related toDerived)?The conversion the other way around makes sense, this one doesn’t.