| 
             Shadowing 
           | 
          
             Overriding 
           | 
        
        
          | When
            base class and derived class have a method of same name but they are
            independent copies, then it is termed as shadowing. | 
          When
            derived class extends and overrides a method of base class, then it
            is termed as overriding. | 
        
        
          Shadowing
            is achieved by using the new keyword in the derived class method signature.
            Here is an example: 
            class baseClass { 
            public void sample(){ } 
            } 
            class derivedClass : baseClass { 
            public new void sample() { } 
            } 
             | 
          Overriding
            is achieved by using the override keyword in the derived class method
            signature. Here is an example: 
            class baseClass { 
            public virtual void sample(){ } 
            } 
            class derivedClass : baseClass { 
            public override void sample() { } 
            } 
             | 
        
        
          Shadowing
            doesn't bother if the base class method is marked as virtual or not.
            In the above example, the method sample is not marked as virtual but
            it will work. Even if you mark the base class method as virtual and
            define your derived class method using new modifier, it will not throw
            any error. Consider the following example: 
            namespace Application1 { 
            public class baseClass { 
            public virtual void sample() { } 
            } 
            public class derivedClass:baseClass { 
            public new void sample() { } 
            } 
            } 
            This example is legal. 
            
           | 
          For
            a method to be overridden, base class method has to be marked as abstract
            or virtual or it should be an overridden method of a higher level
            base class in the hierarchy. Consider the following example: 
            namespace Application1 { 
            class baseClass { 
            public void sample() { } 
            } 
            class derivedClass:baseClass { 
            public override void sample() { } 
            } 
            } 
            During execution of this code, you will get the following error: 
            'Application1.derivedClass.sample()': cannot override inherited member
            'Application1.baseClass.sample()'because it is not marked virtual,
            abstract, or override 
             | 
        
        
          If the
            base class method is defined as abstract, then the method has to be
            overridden in the derived class. Defining the same method with the
            same signature using new modifier will not work. Consider the following
            example: 
            namespace Application1{ 
            abstract class baseClass { 
            public abstract void sample(); 
            } 
            class derivedClass : baseClass { 
            public new void sample() { } 
            } 
            } 
            During execution, this code will end up in the following error: 
            'Application1.derivedClass' does not implement inherited abstract
            member 'Application1.baseClass.sample()' 
             | 
          If there
            is any abstract method in the base class, then it has to overridden
            in the derived class using override keyword. Consider the following
            example: 
            namespace Application1{ 
            abstract class baseClass { 
            public abstract void sample(); 
            } 
            class derivedClass : baseClass { 
            public override void sample() { } 
            } 
            } 
            This is legal and it will work. 
             
               
           | 
        
        
          The
            method sharing the same name in base class and derived class can have
            a different method signature since they are actually two different
            methods. Consider the following example: 
            namespace Application1 { 
            class baseClass { 
            public void sample(){ }; 
            } 
            class derivedClass:baseClass { 
            public void sample(int data) { } 
            } 
            } 
            This example is perfectly legal.  
             | 
          The
            method sharing the same name in base class and derived class are actually
            the same method. Hence they should have the same signature. Consider
            the following example: 
            namespace Application1 { 
            class baseClass { 
            public virtual void sample(){ }; 
            } 
            class derivedClass:baseClass { 
            public override void  
            sample(int data) { } 
            } 
            } 
            This is not permissible and you will get the following error: 
            'Application1.derivedClass.sample(int)': no suitable method found
            to override 
             | 
        
        
          | When
            you don't explicitly specify new or override keywords in your derived
            class method which shares the same name as your base class method,
            then it will implicitly have new modifier. | 
          A method
            will not be overridden implicitly. You have to explicitly override
            a method using override keyword. 
            
           |