Так как boost::/std::shared_ptr имеют преимущество стирания своего делетира, вы можете делать приятные вещи, например
#include <memory>
typedef std::shared_ptr<void> gc_ptr;
int main(){
gc_ptr p1 = new int(42);
gc_ptr p2 = new float(3.14159);
gc_ptr p3 = new char('o');
}
И это будет корректно удалять все указатели благодаря сохранению правильного удаления.
Если вы гарантируете, что каждая реализация вашего интерфейса всегда создается с помощью shared_ptr<Interface> (или make_shared<Interface>), вам действительно нужен деструктор virtual? Я бы объявил его virtual в любом случае, но я просто хочу знать, поскольку shared_ptr всегда будет удалять тип, с которым он был инициализирован (если не задан другой пользовательский отладчик).