私には、次のコードのように avoid(Derived::*)()
を aにキャストすることは完全に安全に見え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