Из моего понимания и использования вашего примера: Под капотом:
Виртуальный метод в базовом классе БУДЕТ иметь запись в таблице методов производного класса.Это означает, что все виртуальные методы типа «объект» доступны во всех таблицах методов их производных классов.
НЕ Виртуальный метод (как в примере кода), без предоставленных функций впроизводные классы фактически НЕ будут иметь записи в таблицах методов производных классов!
Чтобы проверить это, я запустил код в WinDbg, чтобы проверить таблицу методов для класса Manager .
Запись в таблице MethodDesc Имя метода JD MethodDe
506a4960 503a6728 PreJIT System.Object.ToString ()
50698790 503a6730 PreJIT System.Object.Equals (System.Object)
50698360 503a6750 PreJIT System.Object.)
506916f0 503a6764 PreJIT System.Object.Finalize ()
001b00c8 00143904 JIT Manager..ctor ()
0014c065 001438f8 НЕТ Manager.GenProgressReport ()
Итак, я могу видеть методы объекта для виртуального объекта, но не вижу фактического метода GetYearsEmployed, поскольку он не является виртуальным и не имеет производной реализации.Кстати, по той же концепции вы не можете увидеть функцию SomeOtherMethod в производном классе.
Однако вы можете вызывать эти функции, просто их нет в таблице методов.Я могу ошибаться, но я верю, что стек вызовов обходит их.Может быть, это то, что мистер Рихтер имеет в виду в своей книге.Мне трудно читать его книгу, но это потому, что понятия сложны, а он умнее меня :)
Я не уверен, что IL отражает проблему.Я полагаю, что это возможно слой ниже IL, поэтому я использовал Windbg, чтобы посмотреть.Я полагаю, вы могли бы использовать windbg, чтобы увидеть, как он обходит стек ....