Student *team[3];
This means team is an array of three pointers to objects of
the Student class. To be more specific, each pointer in
team can point to an object of the class Student or
a subclass of Student. This makes it possible to do the
following:
team[0] = new Student; team[1] = new CISStudent; team[2] = new ArtStudent;
team[0]->getTranscript() invokes
Student::getTranscript. In fact, team[1]->getTranscript()
and team[2]->getTranscript() all invoke
Student::getTranscript. This is hardly surprising because
all team[] elements are Student pointers.
Here comes the cool part. team[1]->takeTest() invokes
CISStudent::takeTest, while team[2]->takeTest()
invokes ArtStudent::takeTest. This is because the
takeTest method is virtual. You can say that
``a virtual method is sticky, it sticks to the pointer (to the object)''.
In this example, takeTest is sticky, and each type of students
has its own method of taking a test. However, getTranscript is
not sticky, so when a subclass pointer is casted to a superclass pointer,
the getTranscript method is reverted to that of the superclass.