If we could somehow use this as our class, without having to list private data members, then anyone who used the Foo class would not need to know anything about the private data members. If I later changed the data type of private data members, but kept the public interface the same, nobody who used the Foo class would need to change. This means that you are not going to provide an implementation for these functions for the Foo class. One practical result of this is that if I try to create an instance of Foo, the compiler will not allow it. That's because the compiler doesn't know how to perform the setData and getData calls.
Virtual functions ensure that the right functions get called.
Abstract Base Classes are useful as the ultimate base class of several derived classes. For example, in our drawing program, we want to be able to draw more than just Rectangles and Squares. Other types of shapes are not Rectangles, so we cannot use Rectangle as our ultimate base class. Instead we would create an Abstract Base Class called Shape, and use it as the data type for our vectors. From Shape we would have all the other data type derived.