Deadly diamond of death: Grandma / \ / \ Mama Papa f() f() \ / \ / Baby Baby b = new Baby(); b.f() //uh oh WHO'S f()? C++ stream / \ istream ostream \ / iostream reason it works: strict separation of function with istream and iostreeam. Inheritance is an "is-a" relationship. It is also a subtype relationship. A final class cannot be subclassed: String Wrappers for primitives