Наследование (и виртуальные функции соответственно) является одним из основных инструментов, применяемых
в ОО парадигме. Использование виртуальных функций позволяет отделить абстракцию от ее конкретизаций/реализаций.
Таким образом наследование и виртуальные финкции — это фундаментальная фича языка С++ без которой невозможно
(читай очень геморно) писать объектно-ориентированные программы.
Функторы из области обобщенного программирования: очевидные применения — аргументы алгоритмов и т.п. Использование
функторов для формирования интерфейса неправильно (по крайней мере очень не в духе С++).
Здравствуйте, _Winnie, Вы писали:
_W>Под интерфейсами имею в виду базовые классы с абстрактными виртуальными функциями, а под делегатами всякие Loki::Functor/boost::function/Winnie::Closure.
_W>Что когда лучше использовать? _W>Когда виртуальные функции абсолютно не катят, и можно использовать только функторы?
_W>Пока вижу только одно преимущество делегатов — их легко менять в runtime. _W>Но базовые абстрактные классы легче отписывать _W>(Гы, попробуйте отписать указатель на свой метод bind(&Foo::Bar, this) из std::list<boost::function>. Как это сделать?) _W>Есть еще "псевдо-преимущество" — можно подписать чужой класс на событие. Но это редко нужно, и легко реализуется своей виртуальной функцией — переходником.
_W>Perfomance issues неинтересны, вроде бы они понятны. _W>(большие vtbl при использовании очень больших интерфейсов, динамическая аллокация памяти при использовании boost::function).
_W>Еще в boost::function можно засунуть не только пары (объект, метод) но и любой функтор, это мне тоже не интересно, интересны именно (объект, метод).