In this lecture we look at the relationship between inheritance and
subtyping in more detail. First, we look at the tradeoffs between
structural subtyping (the form of subtyping we have studied in functional
languages) and by-name subtyping (the form of subtyping that is more
common in object-oriented languages). Next, we look at the differences
between subtyping and inheritance, and why many object-oriented languages
merge the two. Finally, we look at the fragile base class problem, a
breach of modularity that can occur due to the open recursion supported by
the semantics of inheritance.