We've talked about inheritance before. If class B inherits from class A, then B has everything that A already has, plus B may have some extra stuff. if class Dog inherits from class Animal, Dog will have all the methods and data that Animal has. (For example, genus, species, habitat, etc.) However, Dog may have its own extra stuff. Maybe breed, maybe FavoriteBrandOfDogFood, color). Objects and inheritance are often used to organize data, but objects are more powerful than this. One thing objects can do is "method overriding." An inherited class can override the method of the base class. For example, if Animal has a Talk() method that prints "I am speaking" Dog might also have a Talk() method that says "Bow wow wow" You can do some interesting, powerful, and sometimes weird stuff with this. If I have an Animal pointer, that pointer might be pointing to a Dog object, since every Dog is also an animal. If I say something like a!.Talk() , that's going to run the appropriate Talk method. It doesn't matter that the pointer is an Animal pointer, if it's pointing to a Dog, it will run the Dog's Talk method. If the pointer is pointing to a regular ol' Animal, it will run the Animal Talk method. Just looking at the code a!.Talk() will not tell you which method is being run. You have to know the exact object that a is pointing to, to know which method will run. var Zoo:[Animal?] . . . for a in Zoo { a!.Talk() } That same line of code might run different methods each time it comes up. As the loop runs through the Zoo array, if it encounters a Dog, it will run Dog's Talk. If it encounters and Animal, it runs Animal's Talk.