1. Статические методы — это тип методов по умолчанию. Они вызываются так же, как обычные процедуры и функции. Компилятор знает адреса этих методов, поэтому при вызове статического метода он может статически связать выполняемую информацию с исполняемым файлом. , поэтому статические методы являются самыми быстрыми, но их нельзя переопределить для поддержки полиморфизма.
2. Виртуальные методы и статические методы вызываются одинаково. Поскольку виртуальные методы могут быть переопределены, компилятор не знает адреса указанного виртуального метода, когда он вызывается в коде. Поэтому компилятор ищет адрес функции во время выполнения, создавая таблицу виртуальных методов (VMT). Все виртуальные методы обрабатываются посредством VMT во время выполнения. Помимо самоопределенных виртуальных методов, таблица VMT объекта также содержит все свои виртуальные методы. Поэтому виртуальные методы используют больше памяти, чем динамические методы, но выполняются относительно быстро.
3. Динамические методы в основном похожи на виртуальные, за исключением того, что у них другая система высот. Компилятор присваивает уникальный номер каждому динамическому методу и использует этот номер и адрес динамического метода для создания таблицы динамических методов (DMT). В отличие от таблицы VMT, в таблице DMT объявлены только динамические методы, и этот метод требует, чтобы родительская таблица DMT имела доступ к другим динамическим методам. Из-за этого динамические методы используют меньше памяти, чем виртуальные, но выполняются медленнее, поскольку им, возможно, придется искать динамические методы в DMT объекта.
4. ОП использует переопределение, чтобы метод показывал различное поведение в разных производных классах. Методы, которые могут быть переопределены в OP, — это методы, которые при объявлении помечены как виртуальные или динамические. Чтобы переопределить метод, используйте override вместо виртуального или динамического в объявлении производного класса. После использования переопределения компилятор заменит исходный метод в VMT новым методом, и исходный метод все еще существует. Если вы используете переопределение для повторного объявления статического метода, это настоящее переопределение, которое полностью покрывается новым методом. . Замените тот же метод в классе-предке.