Differences Between Shadowing and Overriding 

When you define a class that inherits from a base class, you sometimes want to redefine one or more of the base class elements in the derived class. Shadowing and overriding are both available for this purpose.

Comparison

It is easy to confuse shadowing with overriding. Both are used when a derived class inherits from a base class, and both redefine one declared element with another. But there are significant differences between the two.

The following table compares shadowing with overriding.

Point of comparison Shadowing Overriding

Purpose

Protecting against a subsequent base class modification that introduces a member you have already defined in your derived class

Achieving polymorphism by defining a different implementation of a procedure or property with the same calling sequence1

Redefined element

Any declared element type

Only a procedure (Function, Sub, or Operator) or property

Redefining element

Any declared element type

Only a procedure or property with the identical calling sequence1

Access level of redefining element

Any access level

Cannot change access level of overridden element

Readability and writability of redefining element

Any combination

Cannot change readability or writability of overridden property

Control over redefining

Base class element cannot enforce or prohibit shadowing

Base class element can specify MustOverride, NotOverridable, or Overridable

Keyword usage

Shadows recommended in derived class; Shadows assumed if neither Shadows nor Overrides specified2

Overridable or MustOverride required in base class; Overrides required in derived class

Inheritance of redefining element by classes deriving from your derived class

Shadowing element inherited by further derived classes; shadowed element still hidden3

Overriding element inherited by further derived classes; overridden element still overridden

1 The calling sequence consists of the element type (Function, Sub, Operator, or Property), name, parameter list, and return type. You cannot override a procedure with a property, or the other way around. You cannot override one kind of procedure (Function, Sub, or Operator) with another kind.

2 If you do not specify either Shadows or Overrides, the compiler issues a warning message to help you be sure which kind of redefinition you want to use. If you ignore the warning, the shadowing mechanism is used.

3 If the shadowing element is inaccessible in a further derived class, shadowing is not inherited. For example, if you declare the shadowing element as Private, a class deriving from your derived class inherits the original element instead of the shadowing element.

Guidelines

You normally use overriding in the following cases:

  • You are defining polymorphic derived classes.

  • You want the safety of having the compiler enforce the identical element type and calling sequence.

You normally use shadowing in the following cases:

  • You anticipate that your base class might be modified and define an element using the same name as yours.

  • You want the freedom of changing the element type or calling sequence.

See Also

Tasks

How to: Distinguish Between Two Elements with the Same Name
How to: Hide a Variable with the Same Name as Your Variable
How to: Hide an Inherited Variable
How to: Access a Variable Hidden by a Derived Class

Reference

Shadows
Overrides

Concepts

Resolving a Reference When Multiple Variables Have the Same Name
Shadowing in Visual Basic

Other Resources

References to Declared Elements