``Object-Oriented Programming'' and ``Data Abstraction'' have become very common terms. Unfortunately, few people agree on what they mean. I will offer informal definitions that appear to make sense in the context of languages like Ada, C++, Modulaa, and Smalltalk. The general idea is to equate ``support for data abstraction'' with the ability to define and use new types and equate ``support for object-oriented programming'' with the ability to express type hierarchies. Features necessary to support these programming styles in a general purpose programming language will be discussed. The presentation centers around C++ but is not limited to facilities provided by that language.