Deri'ved2 dOb2 = new Derived2();
Base baseRef; // ссылка на базовый класс
baseRef = baseOb; baseRef.Who() ;
baseRef = dObl; baseRef.Who();
baseRef = d0b2; baseRef.Who();
}
}
Вот к какому результату приводит выполнение этого кода.
Метод Who() в классе Base.
Метод Who() в классе Derivedl Метод Who() в классе Derived2
В коде из приведенного выше примера создаются базовый классBaseи два производных от него класса —DerivedlиDerived2.В классеBaseобъявляется виртуальный методWho (), который переопределяется в обоих производных классах. Затем в методеMain() объявляются объекты типаBase, DerivedlиDerived2.Кроме того, объявляется переменнаяbaseRefссылочного типаBase.Далее ссылка на каждый тип объекта присваивается переменнойbaseRefи затем используется для вызова методаWho (). Как следует из результата выполнения приведенного выше кода, вариант выполняемого методаWho() определяется по типу объекта, к которому происходит обращение по ссылке во время вызова этого метода, а не по типу класса переменнойbaseRef.
Но переопределять виртуальный метод совсем не обязательно. Ведь если в производном классе не предоставляется собственный вариант виртуального метода, то используется его вариант из базового класса, как в приведенном ниже примере.
/* Если виртуальный метод не переопределяется, то используется его вариант из базового класса. */
using System;
class Base {
// Создать виртуальный метод в базовом классе. public virtual void Who() {
Console.WriteLine("Метод Who() в классе Base");
}
}
class Derivedl : Base {
// Переопределить метод Who() в производном классе.
public override void Who() {
Console.WriteLine("Метод Who() в классе Derivedl");
}
}
class Derived2 : Base {
// В этом классе метод Who() не переопределяется.
}
class NoOverrideDemo { static void Main() {
Base baseOb = new Base();
Derivedl dObl = new Derivedl();
Derived2 d0b2 = new Derived2();
Base baseRef; // ссылка на базовый класс
baseRef = baseOb; baseRef.Who();
baseRef = dObl ; baseRef.Who() ;
baseRef = d0b2;
• baseRef.Who(); // вызывается метод Who() из класса Base}
}
Выполнение этого кода приводит к следующему результату.
Метод Who() в классе Base.
Метод Who() в классе Derivedl Метод Who() в классе Base
В данном примере методWho() не переопределяется в классеDerived2.Поэтому для объекта классаDerived2вызывается методWho() из классаBase.
Если при наличии многоуровневой иерархии виртуальный метод не переопределяется в производном классе, то выполняется ближайший его вариант, обнаруживаемый вверх по иерархии, как в приведенном ниже примере.