非仮想関数へのポインタを得て呼び出すのは簡単だけれど、仮想関数の場合どうなるのかと実験。*1
ベースクラスの仮想関数アドレスを得て呼び出せばレイトバインディングしてくれるみたい。
#include <stdio.h> class hoge{ public: virtual void foo()=0; }; class hoge_impl0 : public hoge{ virtual void foo() { printf("hoge0\n"); } }; class hoge_impl1 : public hoge{ virtual void foo() { printf("hoge1\n"); } }; typedef void (hoge::*method)(); int main() { method m=&hoge::foo; hoge_impl1 h; hoge *p=&h; (p->*m)(); return 0; }
*1 やってみればわかるけど、派生クラスの仮想関数のアドレスを得ようとするとエラーになる。