Объектно-ориентированное программирование на С#. Андрианова А.А - 96 стр.

UptoLike

96
на базовый класс, адреса объекта производного класса. По умолчанию выбор
вызываемой функции осуществляется в соответствии с типом ссылки. В
случае вызова виртуальной функции через ссылку на базовый класс
программа будет использовать метод, определенный для типа объекта, а не
метод, определенный для типа ссылки (реализация принципа позднего
связывания).
Объявление виртуального метода в базовом классе BaseClass
осуществляется добавлением в начало объявления метода ключевого слова
virtual, например:
virtual void Method()
{
. . .
}
В производном классе DerivedClass этот метод может
переопределяться. Для этого в определении метода указывается ключевое
слово override:
override void Method()
{
. . .
}
Продемонстрируем работу виртуального метода на примере:
BaseClass bc = new BaseClass();
DerivedClass dc= new DerivedClass();
BaseClass bcRef; // ссылка на базовый класс
bcRef = bc; // ссылке на базовый класс присваивается
// адрес объекта класса BaseClass
bcRef.Method(); // вызов метода Method() класса BaseClass
bcRef = dc; // ссылке на базовый класс
// присваивается адрес объекта
// класса DerivedClass
bcRef.Method(); // вызов метода Method()
// класса DerivedClass
на базовый класс, адреса объекта производного класса. По умолчанию выбор
вызываемой функции осуществляется в соответствии с типом ссылки. В
случае вызова виртуальной функции через ссылку на базовый класс
программа будет использовать метод, определенный для типа объекта, а не
метод, определенный для типа ссылки (реализация принципа позднего
связывания).
      Объявление виртуального метода в базовом классе BaseClass
осуществляется добавлением в начало объявления метода ключевого слова
virtual, например:

     virtual void Method()
     {
            .    .    .
     }


     В производном классе DerivedClass этот метод может
переопределяться. Для этого в определении метода указывается ключевое
слово override:

     override   void Method()
     {
            .      .   .
     }


      Продемонстрируем работу виртуального метода на примере:

     BaseClass bc = new BaseClass();
     DerivedClass dc= new DerivedClass();
     BaseClass bcRef; // ссылка на базовый класс

     bcRef = bc;           // ссылке на базовый класс присваивается
                           // адрес объекта класса BaseClass

     bcRef.Method();       // вызов метода Method() класса BaseClass

     bcRef = dc;           // ссылке на базовый класс
                           // присваивается адрес объекта
                           // класса DerivedClass

     bcRef.Method();       // вызов метода Method()
                           // класса DerivedClass




96