// We have added M2 to class A. // In addtion, M1 now calls M2. // Does not compile. using System; // New version of A class A { public void M1(){ Console.WriteLine("Method 1"); this.M2(); } // New method in this version. // Same name as the dangerous operation in subclass B public void M2(){ Console.WriteLine("M2 in new version of A"); } } class B: A { // Compile-time error in C#: // 'B.M2()' hides inherited member 'A.M2()'. // Use the new keyword if hiding was intended. public void M2(){ Console.WriteLine("Dangerous Method 2"); } } class Client{ public static void Main(){ A a = new B(); B b = new B(); a.M1(); // Nothing dangerous expected. // Will, however, call the dangerous operation // if M2 is regarded as virtual. a.M2(); // Makes sense when M2 exists in class A. // Dangerous b.M2(); // Expects dangerous operation } }