ABSTRACT DATA TYPES VS. ABSTRACT CLASSES

The terms "abstract data type" and "abstract class" refer to two entirely different concepts, although both of them use the word "abstract" because of an historical accident.  An abstract data type (also called a "concrete type") is a self-contained, user-defined class that bundles data with a set of related operations.  However, it does not inherit from another class, nor does it serve as the base for other classes.  In C++ for example, std::string, std::complex, and std::vector are all abstract data types, or concrete types. 

In contrast, an abstract class is anything but an abstract data type.  An abstract class is a class that has at least one pure virtual member function.  It is not a data type (normally, abstract classes do not contain any data members), nor can you instantiate an object thereof.  An abstract class is merely a skeletal interface, which specifies a set of services that its subclasses implement.  Unfortunately, the distinction between the two concepts is often confused.  Many people erroneously use the term "abstract data type" when they mean an abstract class.