A type can associate operations with the type or with each value of the type. Such operations are called methods. A method is named, and has a signature (see Signatures) that specifies the allowable types for all of its arguments and for its return value, if any.
A method that is associated with the type itself is called a static method.
A method that is associated with a value of the type is either an instance method or a virtual method. When they are invoked, instance and virtual methods are passed the value on which this invocation is to operate (known as this or a this pointer).
The fundamental difference between an instance method and a virtual method is in how the implementation is located. An instance method is invoked by specifying a class and the instance method within that class. The object passed as this may be null (a special value indicating that no particular value is being specified) or an instance of any type that inherits (see Type Inheritance) from the class which defines the method. A virtual method can also be called in this manner. This occurs, for example, when an implementation of a virtual method wishes to call the implementation supplied by its parent class. The VOS allows this to be null inside the body of a virtual method.
A virtual method (but not an instance method) may also be called by a different mechanism, a virtual call. Any type that inherits from a type that defines a virtual method can provide its own implementation of that method (this is known as overriding, see Hiding, Overriding, and Layout). It is the exact type of the object (determined at runtime) that is used to decide which of the implementations to invoke