In reply to eda2k4:
A cast to a class variable, or any kind of assignment to a class variable never changes the object; it only copies the class handle into the target class variable. $cast only adds a run-time check to make sure the handle is valid type to be stored in the class variable.
Class methods are never constructed or copied; they are part of the class type, just like static class members. Every class method you define exists regardless of whether they are virtual or non-virtual. The only difference is their visibility when they are referenced.
A class type provides information on how to look up everything in a class object by way of a set of mapping tables. There is a table for each virtual method. When you reference a virtual method with a class variable, the object type of the handle is used to look up which virtual method to call.