«Магия» - это справочная таблица.
Когда вы объявили метод как виртуальный, метод будет добавлен в таблицу, связанную с типом, и все вызовы метода будут искать адрес метода для вызова в таблице.
Таким образом, вместо компиляции при вызове определенного метода по определенному адресу вызов будет скомпилирован как поиск, а затем вызов значения, которое было извлечено из таблицы.
Например, предположим, что базовый тип имеет эту таблицу:
[1000]
Для первого типа, рассматриваемый метод является по адресу 1000.
Для второго типа, эта таблица выглядит это:
[2000]
То же самое (переопределены) метод в настоящее время по адресу 2000.
Если метод не был виртуальным, вызов к нему, как этот вызов:
baseObject.Method1();
будет составлен на что-то вроде этого:
call method at address 1000
Но теперь вместо этого он будет выглядеть примерно так:
get address to type virtual method table (vtable)
get adress from index 0 in the table
call the method at that address
[Вот блог от Эрика Липперта об этом.] (Http://blogs.msdn.com/b/ericlippert/archive/2011/03/17/implementing-the-virtual-method-pattern-in- c-part-one.aspx) –