Basically, with all three of those objects- Triangle, Circle, Rectangle- they all hold the function Draw in common. In other words, when the for loop iterates through the list of objects to call that specific function, it will do so for all three. This would normally not work if the function in the parent class was not abstract.
This would normally not work if the function in the parent class was not abstract.
This is not true. DrawableObject::Draw() is declared as virtual. This means that, even if DrawableObject::Draw() were defined, then the actual type of the object pointed to by a DrawableObject* will be correctly resolved at runtime, and if Draw() is overridden in the derived class, it will be called.
You don't need the base class method to be abstract, for polymorphism to work. The method just has to be virtual.