Как правильно работать с интерфейсами?
У вас какая-то беда с пониманием указателей.
В функцию нужно передавать указатель на IShape, если вы хотите работать с цепочкой наследования.
А вот конструкции типа
Simplex simplex = *(new Simplex());
- просто лютая дичь.
Приблизительно так
class IShape
{
  public:
    virtual Vector FarthestPointInDirection(Vector direction) = 0; // pure virtual function
};
class Polygon : public IShape{
...
Vector FarthestPointInDirection(Vector direction) override{
....
}
};
Vector support(IShape& a, IShape& b, Vector direction){
 Vector aFar = a.FarthestPointInDirection(direction);
  Vector bFar = b.FarthestPointInDirection(direction);
  return *aFar.Sub(bFar);
}