Да.Это полностью имеет смысл.
Любая перегрузка оператора, в конце концов, является функцией.Это добавляет синтаксический сахар к языку.Иногда они необходимы , но часто это просто синтаксический сахар.
Обратите внимание, что вы должны вызывать его полиморфно (конечно, если вы хотите полиморфизм времени выполнения), и тамВы можете сделать это двумя способами:
- с использованием указателя базового типа и
- с использованием ссылки базового типа
Пример ( demo ),
struct A
{
virtual void operator()() { cout << "A" << endl; }
};
struct B : A
{
virtual void operator()() { cout << "B" << endl; }
};
int main() {
B b;
//using pointer
A *ptr = &b;
(*ptr)(); //clumsy! - prints B
//using reference
A &ref = b;
ref(); //better - prints B
//also correct
b(); //prints B
return 0;
}
И если у вас есть шаблон функции, записанный в виде:
template<typename Functor>
void call(Functor fun)
{
(*fun)();
}
Тогда вы можетеиспользуйте эту функцию для функторов и обычных функций:
void regular_function()
{
cout << "regular_function" << endl;
}
B b;
call(&b); //prints B
call(regular_function); //prints regular_function
Демо: http://ideone.com/B9w16