The problem is
virtual ~ISolution() = 0;
the destructor is not implemented. Try
virtual ~ISolution() { }
instead.
This is needed even when only instances of the derived class are created, because destructors are special. In a normal function, the base class implementation needs to be called explicitly, like
void Derived::Foo() {
Base::Foo();
....
}
but for a destructor, this is always done automatically.