* Virtual destructor; absolutely
* necessary in this case.
*
- * This destructor is declared
- * pure virtual, such that
- * objects of this class cannot
- * be created. Since all the
- * other virtual functions have a
- * pseudo-implementation to avoid
- * overhead in derived classes,
- * this is the best place to do
- * this.
+ * This destructor is declared pure virtual, such that objects of this class
+ * cannot be created. Since all the other virtual functions have a
+ * pseudo-implementation to avoid overhead in derived classes, they can not
+ * be abstract. As a consequence, we could generate an object of this class
+ * because none of this class's functions are abstract.
*
- * Nevertheless, since derived
+ * We circumvent this problem by making the destructor of this class
+ * abstract virtual. This ensures that at least one member function is
+ * abstract, and consequently, no objects of type Function can be
+ * created. However, there is no need for derived classes to explicitly
+ * implement a destructor: every class has a destructor, either explicitly
+ * implemented or implicitly generated by the compiler, and this resolves
+ * the abstractness of any derived class even if they do not have an
+ * explicitly declared destructor.
+ *
+ * Nonetheless, since derived
* classes want to call the
* destructor of a base class,
- * the destructor is implemented
+ * this destructor is implemented
* (despite it being pure
* virtual).
*/