Es gibt kein "virtual new". Das ist nicht mehr als die Kombination der zwei Keywords, der Compiler sollte da keine Fallunterscheidung eingebaut haben.
Dazu muss man natürlich erst einmal sagen: "new" macht sowieso überhaupt nichts. Damit zeigst du nur, dass du willentlich einen neuen
Slot einführen willst, und unterdrückst damit die entsprechende Warnung.
So, nun zu den Slots: Das ist der Mechanismus, der hinter der ganzen Polymorphie steckt.
Jede Methode ohne override führt einen neuen Slot ein, also z.B. ClassA.Show. ClassB führt nun keinen eigenen Slot ein, sondern schreibt seine Show-Methode einfach
in den bestehenden ClassA.Show-Slot. Deswegen kann mal die eine, mal die andere Methode aufgerufen werden, wenn du von einer ClassA-Variablen Show aufrufst.
ClassC führt nun also einen
zweiten Slot ein - mit virtual hat das erstmal nichts zu tun. ClassD schreibt sich nun wieder dort hinein - was natürlich nur möglich ist, weil ClassC.Show eben doch virtual ist.
Die Slots der einzelnen Klassen (die von System.Object lass ich mal weg

) sehen also in deinem Beispiel so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| ClassA: 0. ClassA.Show
ClassB: 0. ClassB.Show
ClassC: 0. ClassB.Show 1. ClassC.Show
ClassD: 0. ClassB.Show 1. ClassD.Show |
Damit wird der Output deines Programms hoffentlich klar: Da du 4 ClassA-Variablen hast und ClassA.Show den Slot #0 eingeführt hat, wird dieser viermal aufgerufen: ABBB.
Den zweiten Slot kannst du so nutzen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| ClassA A = new ClassA(); A.Show(); ClassA B = new ClassB(); B.Show(); ClassC C = new ClassC(); C.Show(); ClassC D = new ClassD(); D.Show(); Console.ReadLine(); |
Was kommt dann raus

?