Я понимаю, почему вызов виртуальной функции из конструктора - это плохо, но я не уверен, почему определение деструктора приведет к исключению "чистого виртуального метода с именем". В коде используются константные значения, чтобы сократить использование динамического распределения, что, возможно, также является причиной.
#include <iostream>
using namespace std;
class ActionBase {
public:
~ActionBase() { } // Comment out and works as expected
virtual void invoke() const = 0;
};
template <class T>
class Action : public ActionBase {
public:
Action( T& target, void (T::*action)())
: _target( target ), _action( action ) { }
virtual void invoke() const {
if (_action) (_target.*_action)();
}
T& _target;
void (T::*_action)();
};
class View {
public:
void foo() { cout << "here" << endl; }
};
class Button : public View {
public:
Button( const ActionBase& action )
: _action( action ) { }
virtual void mouseDown() {
_action.invoke();
}
private:
const ActionBase& _action;
};
int main( int argc, char* argv[] )
{
View view;
Button button = Button( Action<View>( view, &View::foo ) );
button.mouseDown();
return 0;
}
ActionBase
virtual
. См. parashift.com/c++-faq-lite/virtual. -functions.html#faq-20.7 - person Alok Singhal   schedule 01.01.2010