using System; class Animal { public virtual void talk() { Console.Write("...\n"); } } class Cat : Animal { public override void talk() { Console.Write("Meow!\n"); } } class NyanCat : Cat { // we dont want this one public virtual void talk() { Console.Write("NyanNyanNyanNyanNyanNyan Batman!\n"); } } class Dima : NyanCat { public override void talk() { Console.Write("DIMA THE BEST!\n"); } } public class Test { public static void Main() { Animal a = new Animal(); a.talk(); // ... a = new Cat(); a.talk(); // Meow a = new NyanCat(); a.talk(); // Meow a = new Dima(); a.talk(); // Meow // the reason: Cat.print() is not virtual, // so we have broken the chain of virtuality /********************/ // a new chain starts from NyanCat class NyanCat cat = new NyanCat(); cat.talk(); // Batman! cat = new Dima(); cat.talk(); // THE BEST } }