When an instance method declaration includes an override
modifier, the method overrides an inherited virtual method with the same signature. Whereas a virtual
method declaration introduces a new method, an override
method declaration specializes an existing inherited virtual method by providing a new implementation of the method.
It is an error for an override method declaration to include any one of the new
, static
, virtual
, or abstract
modifiers.
The method overridden by an override
declaration is known as the overridden base method. For an override method M
declared in a class C
, the overridden base method is determined by examining each base class of C
, starting with the direct base class of C
and continuing with each successive direct base class, until an accessible method with the same signature as M
is located. For purposes of locating the overridden base method, a method is considered accessible if it is public
, if it is protected
, if it is protected internal
, or if it is internal
and declared in the same project as C
.
A compile-time error occurs unless all of the following are true for an override declaration:
An override declaration can access the overridden base method using a base-access (§7.5.8). In the example
class A { int x; public virtual void PrintFields() { Console.WriteLine("x = {0}", x); } } class B: A { int y; public override void PrintFields() { base.PrintFields(); Console.WriteLine("y = {0}", y); } }
the base.PrintFields()
invocation in B
invokes the PrintFields
method declared in A
. A base-access disables the virtual invocation mechanism and simply treats the base method as a non-virtual method. Had the invocation in B
been written ((A)this).PrintFields()
, it would recursively invoke the PrintFields
method declared in B
, not the one declared in A
.
Only by including an override
modifier can a method override another method. In all other cases, a method with the same signature as an inherited method simply hides the inherited method. In the example
class A { public virtual void F() {} } class B: A { public virtual void F() {} // Warning, hiding inherited F() }
the F
method in B
does not include an override
modifier and therefore does not override the F
method in A
. Rather, the F
method in B
hides the method in A
, and a warning is reported because the declaration does not include a new
modifier.
In the example
class A { public virtual void F() {} } class B: A { new private void F() {} // Hides A.F within B } class C: B { public override void F() {} // Ok, overrides A.F }
the F
method in B
hides the virtual F
method inherited from A
. Since the new F
in B
has private access, its scope only includes the class body of B
and does not extend to C
. The declaration of F
in C
is therefore permitted to override the F
inherited from A
.