Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №2 2015.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
221.17 Кб
Скачать

Виртуальный метод

Виртуальный метод (виртуальная функция) — в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.

Виртуальные методы — один из важнейших приёмов реализации полиморфизма. Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника. При этом, базовый класс определяет способ работы с объектами и любые его наследники могут предоставлять конкретную реализацию этого способа.

Базовый класс может и не предоставлять реализации виртуального метода, а только декларировать его существование. Такие методы без реализации называются «чисто виртуальными» или абстрактными. Т.е. абстрактные методы являются виртуальными.

Для каждого класса, имеющего хотя бы один виртуальный метод, создаётся таблица виртуальных методов. Каждый объект хранит указатель на таблицу своего класса. Для вызова виртуального метода используется следующий механизм: из объекта берётся указатель на соответствующую таблицу виртуальных методов, а из неё, по фиксированному смещению, — указатель на реализацию метода, используемого для данного класса. При использовании множественного наследования или интерфейсов ситуация несколько усложняется за счёт того, что таблица виртуальных методов становится нелинейной.

Пример объявления и работы виртуальных методов

class Ancestor

{

public virtual void function1 ()

{

Console.WriteLine(”Ancestor.function1()”);

}

public void function2 ()

{

Console.WriteLine(”Ancestor.function2()”);

}

}

class Descendant : Ancestor

{

public override void function1 ()

{

Console.WriteLine(”Descendant.function1()”);

}

public void function2 ()

{

Console.WriteLine(”Descendant.function2()”);

}

}

Descendant descendant = new Descendant();

Ancestor ancestor = descendant;

descendant.Function1();

descendant.Function2();

ancestor.Function1();

ancestor.Function2();

В этом примере класс Ancestor определяет две функции, одну из них виртуальную, другую — нет. Класс Descendant переопределяет обе функции. Однако, казалось бы одинаковое обращение к функциям, даёт разные результаты. На выводе программа даст следующее:

Descendant.Function1

Descendant.Function2

Descendant.Function1

Ancestor.Function2

Для продолжения нажмите любую клавишу . . .

Объект

Объект наряду с понятием «класс», является важным понятием объектно-ориентированного подхода в программировании. Под объектом подразумевается некоторая сущность, обладающая состоянием и поведением. Как правило, при рассмотрении объектов выделяется, что объекты принадлежат одному или нескольким классам, которые в свою очередь определяют поведение объекта. Время с момента создания объекта до его уничтожения называется временем жизни объекта.

Инстанцирование (англ. instantiation) — создание экземпляра класса. В отличие от слова «создание» применяется не к объекту, а к классу. То есть говорят создать экземпляр класса или инстанцировать класс. Порождающие паттерны используют полиморфное инстанцирование.

Экземпляр класса (англ. instance) — это описание конкретного объекта в памяти. Класс описывает свойства и методы, которые будут доступны у объекта, построенного по описанию, заложенному в класс. Экземпляры используют для представления конкретных сущностей реального мира

Пример создания экземпляра класса (объекта):

Parent parent = new Parent();