In this article, I’ll explain how virtual,
override and new keywords are different from each other by taking some examples
as give below.
The virtual keyword is used to modify a method, property, indexer, or events declared
in the base class and allow it to be overridden in the derived class.
The override keyword is used to extend or modify a virtual/abstract method, property,
indexer, or event of base class into derived class.
The new keyword is used to hide a method, property, indexer, or event of base class
into derived class.
Virtual and Override keywords are used in method overriding concept while new keyword is used in method
overloading concept.
Virtual and Override keywords are also called run-time polymorphism while new keyword is called compile-time
polymorphism.
Virtual and Override keywords cause late binding while new keyword causes early
binding.
Method
Overriding (Virtual
and Override Keyword) -
For overriding the base class method in derived
class, you must have to declare base class method as virtual and derived class method as override.
Let’s see in the below example –
namespace
ConsoleApplication1
{
class ClassA
{
public
virtual void
TestMethod()
{
Console.WriteLine("ClassA::MethodA()");
}
}
class ClassB
: ClassA
{
public
override void
TestMethod()
{
Console.WriteLine("ClassB:TestMethod()");
}
}
class ClassC
: ClassB
{
public
override void
TestMethod()
{
Console.WriteLine("ClassC:TestMethod()");
}
}
class Test
{
static
void Main(string[]
args)
{
ClassB
b = new ClassB();
b.TestMethod();
// output -->
"ClassB::TestMethod()"
ClassC
c = new ClassC();
c.TestMethod();
// output -->
"ClassC::TestMethod()"
Console.ReadLine();
}
}
}
Method
Hiding (New keyword) – The new keyword is used to hide a method, property, indexer, or event
of base class into derived class.
Let’s see the example in detail -
namespace
ConsoleApplication1
{
class ClassA
{
public
void TestMethod()
{
Console.WriteLine("ClassA::TestMethod()");
}
}
class ClassB
: ClassA
{
public
new void
TestMethod()
{
Console.WriteLine("ClassB:TestMethod()");
}
}
class Test
{
static
void Main(string[]
args)
{
ClassA
a1 = new ClassA();
a1.TestMethod();
//Output -
ClassA::TestMethod()
ClassB
b1 = new ClassB();
b1.TestMethod();
//Output -
ClassB::TestMethod()
ClassA
a2 = new ClassB();
a2.TestMethod();
//Output -
ClassA::TestMethod()
Console.ReadLine();
}
}
}
Other example for new Keyword –
namespace
ConsoleApplication1
{
class A
{
public
void showMe()
{
Console.WriteLine("Base
Class method - showMe!");
Console.ReadLine();
}
}
class B
: A
{
public
new void
showMe()
{
Console.WriteLine("Derived
Class method - showMe!");
Console.ReadLine();
}
}
class Test
{
static
void Main(string[]
args)
{
B
a = new B();
a.showMe();
//Output - Derived Class method - showMe!
Console.ReadLine();
}
}
}
And
namespace
ConsoleApplication1
{
class A
{
public
void showMe()
{
Console.WriteLine("Base
Class method - showMe!");
Console.ReadLine();
}
}
class B
: A
{
public
void showMe()
//Warning - Use the new keyword if hiding was
intended.
{
Console.WriteLine("Derived
Class method - showMe!");
Console.ReadLine();
}
}
class Test
{
static
void Main(string[]
args)
{
B
a = new B();
a.showMe();
//Output - Derived Class method - showMe!
Console.ReadLine();
}
}
}
And other example –
namespace
ConsoleApplication1
{
class A
{
public
void showMe()
{
Console.WriteLine("Base
Class method - showMe!");
Console.ReadLine();
}
}
class B
: A
{
public
new void
showMe()
{
Console.WriteLine("Derived
Class method - showMe!");
Console.ReadLine();
}
}
class Test
{
static
void Main(string[]
args)
{
A
a = new A();
a.showMe();
//Output - Base Class method - showMe!
B
b = new B();
b.showMe();
//Output - Derived Class method - showMe!
a
= new B();
a.showMe();//Output
- Base Class method - showMe!
Console.ReadLine();
}
}
}
And other example –
namespace
ConsoleApplication1
{
class A
{
public
virtual void
showMe()
{
Console.WriteLine("Base
Class method - showMe!");
Console.ReadLine();
}
}
class B
: A
{
public
new void
showMe()
{
Console.WriteLine("Derived
Class method - showMe!");
Console.ReadLine();
}
}
class Test
{
static
void Main(string[]
args)
{
A
a = new A();
a.showMe();
//Output - Base Class method - showMe!
B
b = new B();
b.showMe();
//Output - Derived Class method - showMe!
a
= new B();
a.showMe();//Output
- Base Class method - showMe!
Console.ReadLine();
}
}
}
Overloading examples –
namespace
ConsoleApplication1
{
class ClassA
{
public
void TestMethod(int
a)
{
Console.WriteLine("ClassA::TestMethod()");
}
}
class ClassB
: ClassA
{
public
void TestMethod(ref
int a)
{
Console.WriteLine("ClassB:TestMethod()");
}
}
class Test
{
static
void Main(string[]
args)
{
//ClassB a = new
ClassA();//Child class reference can't hold the parent class object.
ClassA
a=new ClassA();
ClassA
a1 = new ClassB();
ClassB
b = new ClassB();
a.TestMethod(2);
//Output - ClassA::TestMethod()
a1.TestMethod(3);
//Output - ClassA::TestMethod()
b.TestMethod(4);
//Output - ClassA::TestMethod()
int
x = 10;
b.TestMethod(ref
x); //Output
- ClassB::TestMethod()
Console.ReadLine();
}
}
}
Other examples are -
Inherited Methods
namespace ConsoleNamespace
{
class ClassA
{
public void MethodA()
{
Console.WriteLine("A::MethodA()");
}
}
class ClassB : ClassA { }
class Test
{
static void Main(string[] args)
{
ClassA a = new ClassA();
a.MethodA();
// output --> "A::MethodA()"
ClassB b = new ClassB();
b.MethodA();
// output --> "A::MethodA()"
}
}
}
The method MethodA() can be overridden in classes ClassB and ClassC
//The method MethodA() can be overridden in classes ClassB and ClassC
namespace ConsoleNamespace
{
class ClassA
{
public void MethodA()
{
Console.WriteLine("ClassA::MethodA()");
}
}
class ClassB : ClassA
{
public void MethodA()
{
Console.WriteLine("ClassB:MethodA()");
}
}
class Test
{
static void Main(string[] args)
{
ClassA a = new ClassA();
ClassB b = new ClassB();
a.MethodA();
// output --> "ClassA::MethodA()"
b.MethodA();
// output --> "ClassB::MethodA()"
a = new ClassB();
a.MethodA();
// output --> "ClassA::MethodA()"
}
}
}
Virtual and Overridden Methods
namespace ConsoleNamespace
{
class ClassA
{
public virtual void MethodA()
{
Console.WriteLine("ClassA::MethodA()");
}
}
class ClassB : ClassA
{
public override void MethodA()
{
Console.WriteLine("ClassB:MethodA()");
}
}
class Test
{
static void Main(string[] args)
{
ClassA a = new ClassA();
ClassB b = new ClassB();
a.MethodA();
// output --> "ClassA::MethodA()"
b.MethodA();
// output --> "ClassB::MethodA()"
a = new ClassB();
a.MethodA();
// output --> "ClassB::MethodA()"
Console.ReadLine();
}
}
}
Method Hiding
namespace ConsoleNamespace
{
class ClassA
{
public virtual void MethodA()
{
Console.WriteLine("ClassA::MethodA()");
}
}
class ClassB : ClassA
{
public new void MethodA()
{
Console.WriteLine("ClassB:MethodA()");
}
}
class Test
{
static void Main(string[] args)
{
ClassA a = new ClassA();
ClassB b = new ClassB();
a.MethodA();
// output --> "ClassA::MethodA()"
b.MethodA();
// output --> "ClassB::MethodA()"
a = new ClassB();
a.MethodA();
// output --> "ClassB::MethodA()"
Console.ReadLine();
}
}
}
Combining Method Overriding and Hiding
namespace ConsoleNamespace
{
class ClassA
{
public void MethodA()
{
Console.WriteLine("ClassA::MethodA()");
}
}
class ClassB : ClassA
{
public virtual new void MethodA()
{
Console.WriteLine("ClassB:MethodA()");
}
}
class Test
{
static void Main(string[] args)
{
ClassA a = new ClassA();
ClassB b = new ClassB();
a.MethodA();
// output --> "ClassA::MethodA()"
b.MethodA();
// output --> "ClassB::MethodA()"
a = new ClassB();
a.MethodA();
// output --> "ClassB::MethodA()"
Console.ReadLine();
}
}
}