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
}
}
dXNpbmcgU3lzdGVtOwoKY2xhc3MgQW5pbWFsIHsKCXB1YmxpYyB2aXJ0dWFsIHZvaWQgdGFsaygpIHsKCQlDb25zb2xlLldyaXRlKCIuLi5cbiIpOwoJfQp9CgpjbGFzcyBDYXQgOiBBbmltYWwgewoJcHVibGljIG92ZXJyaWRlIHZvaWQgdGFsaygpIHsKCQlDb25zb2xlLldyaXRlKCJNZW93IVxuIik7Cgl9Cn0KCmNsYXNzIE55YW5DYXQgOiBDYXQgewoJLy8gd2UgZG9udCB3YW50IHRoaXMgb25lCglwdWJsaWMgdmlydHVhbCB2b2lkIHRhbGsoKSB7CgkJQ29uc29sZS5Xcml0ZSgiTnlhbk55YW5OeWFuTnlhbk55YW5OeWFuIEJhdG1hbiFcbiIpOwoJfQp9CgpjbGFzcyBEaW1hIDogTnlhbkNhdCB7CglwdWJsaWMgb3ZlcnJpZGUgdm9pZCB0YWxrKCkgewoJCUNvbnNvbGUuV3JpdGUoIkRJTUEgVEhFIEJFU1QhXG4iKTsKCX0KfQoKcHVibGljIGNsYXNzIFRlc3QgewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKSB7CgkJQW5pbWFsIGEgPSBuZXcgQW5pbWFsKCk7CgkJYS50YWxrKCk7ICAvLyAuLi4KCQkKCQlhID0gbmV3IENhdCgpOwoJCWEudGFsaygpOyAgLy8gTWVvdwoJCQoJCWEgPSBuZXcgTnlhbkNhdCgpOwoJCWEudGFsaygpOyAgLy8gTWVvdwoJCQoJCWEgPSBuZXcgRGltYSgpOwoJCWEudGFsaygpOyAgLy8gTWVvdwoJCQoJCS8vIHRoZSByZWFzb246IENhdC5wcmludCgpIGlzIG5vdCB2aXJ0dWFsLAoJCS8vICAgc28gd2UgaGF2ZSBicm9rZW4gdGhlIGNoYWluIG9mIHZpcnR1YWxpdHkKCQkKCQkvKioqKioqKioqKioqKioqKioqKiovCgkJCgkJLy8gYSBuZXcgY2hhaW4gc3RhcnRzIGZyb20gTnlhbkNhdCBjbGFzcwoJCQoJCU55YW5DYXQgY2F0ID0gbmV3IE55YW5DYXQoKTsKCQljYXQudGFsaygpOyAgLy8gQmF0bWFuIQoJCQoJCWNhdCA9IG5ldyBEaW1hKCk7CgkJY2F0LnRhbGsoKTsgIC8vIFRIRSBCRVNUCgl9Cn0=