Click to Rate and Give Feedback
MSDN
MSDN Library
Visual Studio 2005
Visual Studio
Visual C#
C# Reference
C# Keywords
Modifiers
 virtual

  Switch on low bandwidth view
This page is specific to
Microsoft Visual Studio 2005/.NET Framework 2.0

Other versions are also available for the following:
C# Language Reference
virtual (C# Reference)

The virtual keyword is used to modify a method, property, indexer or event declaration, and allow it to be overridden in a derived class. For example, this method can be overridden by any class that inherits it:

public virtual double Area() 
{
    return x * y;
}

The implementation of a virtual member can be changed by an overriding member in a derived class. For more information on using the virtual keyword, see Versioning with the Override and New Keywords (C# Programming Guide) and Knowing When to Use Override and New Keywords (C# Programming Guide).

When a virtual method is invoked, the run-time type of the object is checked for an overriding member. The overriding member in the most derived class is called, which might be the original member, if no derived class has overridden the member.

By default, methods are non-virtual. You cannot override a non-virtual method.

You cannot use the virtual modifier with the static, abstract, private or override modifiers.

Virtual properties behave like abstract methods, except for the differences in declaration and invocation syntax.

  • It is an error to use the virtual modifier on a static property.

  • A virtual inherited property can be overridden in a derived class by including a property declaration that uses the override modifier.

In this example, the class Dimensions contains the two coordinates x, y, and the Area() virtual method. Different shape classes such as Circle, Cylinder, and Sphere inherit the Dimensions class, and the surface area is calculated for each figure. Each derived class has it own override implementation of Area(). The program calculates and displays the proper area for each figure by invoking the proper implementation of Area() according to the object associated with the method.

Notice that the inherited classes Circle, Sphere, and Cylinder are all using constructors that initialize the base class, for example:

public Cylinder(double r, double h): base(r, h) {}

This is analogous to the C++ initialization list.

// cs_virtual_keyword.cs
using System;
class TestClass
{
    public class Dimensions
    {
        public const double PI = Math.PI;
        protected double x, y;
        public Dimensions()
        {
        }
        public Dimensions(double x, double y)
        {
            this.x = x;
            this.y = y;
        }

        public virtual double Area()
        {
            return x * y;
        }
    }

    public class Circle : Dimensions
    {
        public Circle(double r) : base(r, 0)
        {
        }

        public override double Area()
        {
            return PI * x * x;
        }
    }

    class Sphere : Dimensions
    {
        public Sphere(double r) : base(r, 0)
        {
        }

        public override double Area()
        {
            return 4 * PI * x * x;
        }
    }

    class Cylinder : Dimensions
    {
        public Cylinder(double r, double h) : base(r, h)
        {
        }

        public override double Area()
        {
            return 2 * PI * x * x + 2 * PI * x * y;
        }
    }

    static void Main()
    {
        double r = 3.0, h = 5.0;
        Dimensions c = new Circle(r);
        Dimensions s = new Sphere(r);
        Dimensions l = new Cylinder(r, h);
        // Display results:
        Console.WriteLine("Area of Circle   = {0:F2}", c.Area());
        Console.WriteLine("Area of Sphere   = {0:F2}", s.Area());
        Console.WriteLine("Area of Cylinder = {0:F2}", l.Area());
    }
}
Area of Circle   = 28.27
Area of Sphere   = 113.10
Area of Cylinder = 150.80

For more information, see the following sections in the C# Language Specification:

  • 1.6.5.4 Virtual, override and abstract methods

  • 10.5.3 Virtual methods

  • 10.6.3 Virtual, sealed, override, and abstract accessors

Tags What's this?: Add a tag
Community Content   What is Community Content?
Add new content RSS  Annotations
This inheritance example is absolutely wrong!      oren_ran   |   Edit   |   Show History
The base rule of inheritance is that class B extends class A if and only if B is type of A.
Therefore, Circle (as well as any other shape) should not extend Dimensions.
Tags What's this?: Add a tag
Flag as ContentBug
...inheritance?      hboss   |   Edit   |   Show History
This isn't an example of inheritance... it is an example on how to use the virtual keyword, which does a good job of explaining it.
Tags What's this?: Add a tag
Flag as ContentBug
This is an official site      Miranda Yang   |   Edit   |   Show History
MSDN is an offical site working for Microsoft. Please using high standard for yourself. Although this is not an example for inheritance, when you writing an example related to inheritance, you have to use a reasonable one to avoid any confusion.
Tags What's this?: Add a tag
Flag as ContentBug
Inheritance      Daniel Smith   |   Edit   |   Show History
The base class "Dimensions" is badly named. If they'd called it "Shape" then it would make more sense, and not distract from the actual topic.
Tags What's this?: Add a tag
Flag as ContentBug
why static members cann't be tagged as virtual      Praneeth Chandra ... Thomas Lee   |   Edit   |   Show History

Could please anyone explain the reasons behind not able to tag static members as virtual, in terms of clr internals, memory allocation and etc and a practical real time example would also be of great help??


Cheers
Praneeth Chandra Y

[tfl - 06 07 09] Hi - and thanks for your post. You should post questions like this to the MSDN Forums at http://forums.microsoft.com/msdn or the MSDN Newsgroups at

http://www.microsoft.com/communities/newsgroups/en-us/ . You are much more likely get a quicker response using the forums than through the Community Content. For specific help about:
Visual Studio :
http://groups.google.com/groups/dir?sel=usenet%3Dmicrosoft.public.vstudio%2C &
SQL Server :
http://groups.google.com/groups/dir?sel=usenet%3Dmicrosoft.public.sqlserver%2C &
.NET Framework :
http://groups.google.com/groups/dir?sel=usenet%3Dmicrosoft.public.dotnet.framework
All Public : http://groups.google.com/groups/dir?sel=usenet%3Dmicrosoft.public%2C &

Processing
© 2009 Microsoft Corporation. All rights reserved. Terms of Use  |  Trademarks  |  Privacy Statement
Page view tracker