Виртуальные методы
По умолчанию, методы являются статическими, однако они мо-
гут, за исключением конструкторов, быть виртуальными (посредством включения директивы virtual в описание метода). Компилятор разре- шает ссылки на вызовы статических методов во время процесса ком- пиляции, тогда как вызовы виртуальных методов разрешаются во вре- мя выполнения. Это иногда называют поздним связыванием.
Если объектный тип объявляет или наследует какой-либо вирту- альный метод, то переменные этого типа должны быть инициализиро- ваны посредством вызова конструктора перед вызовом любого вирту- ального метода. Таким образом, объектный тип, который описывает или наследует виртуальный метод, должен также описывать или нас- ледовать по крайней мере один метод-конструктор.
Объектный тип может переопределять любой из методов, которые он наследует от своих родителей. Если описание метода в потомке указывает тот же идентификатор метода, что и описание метода в родителе, то описание в потомке переопределяет описание в родите- ле. Область действия переопределяющего метода расширяется до сфе- ры действия потомка, в котором этот метод был введен, и будет ос- таваться таковой, пока идентификатор метода не будет переопреде- лен снова.
Переопределение статического метода не зависит от изменения заголовка метода. В противоположность этому, переопределение вир- туального метода должно сохранять порядок, типы и имена парамет- ров, а также типы результатов функций, если таковые имеются. Бо- лее того, переопределение опять же должно включать директиву virtual.