■
気になったので適当に作ってみた。
#include <iostream> struct base{ virtual ~base(){} template< typename T > void func(T rhs){ try{ dynamic_cast<virtual_func<T>&>(*this)(rhs); } catch(std::bad_cast&){} } template< typename T > struct virtual_func{ virtual void operator ()(T) = 0; }; }; struct sub : public base , public base::virtual_func<int> , public base::virtual_func<float>{ virtual void operator ()(int){ std::cout << "func(int);\n"; } virtual void operator ()(float){ std::cout << "func(float);\n"; } }; int main(){ sub foo; base* b = &foo; b->func(10); // sub::operator()(int) b->func(0.35f); // sub::operator()(float) b->func("test"); // 派生側で実装されていないの呼ばれない getchar(); return 0; }
名前が適当なのはご愛嬌。
複数の仮想関数をオーバーライドする場合がめんどくさそうだなぁ…。
あと引数を渡すときに暗黙の型キャストが行われないのも問題。
しかし、tab8だと読みづらいな…。