気になったので適当に作ってみた。

#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だと読みづらいな…。