In this chapter we start to explore the concepts of inheritance and substitution. Inheritance is one of the hallmarks of object-oriented programming. But the simple idea has many subtle implications that might not at first seem obvious. In this chapter we will explopre the intuitive and practical meaning of inheritance, the syntax used to describe inheritance in various langauges, some of the various different forms of inheritance, that is, the way that inheritance is used, and some of the benefits as well as some of the costs of inheritance.