Лекция 13 (1160846), страница 2

Файл №1160846 Лекция 13 (Лекции (2009) (Саша Федорова)) 2 страницаЛекция 13 (1160846) страница 22019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 2)

2) ищется ближайший заместитель.

Если ни одного заместителя не встретилось, вызывается метод базового класса.

При этом составляется таблица виртуальных методов – содержит виртуальные методы и их адреса.

Как мы работаем с таблицей?

  1. вытаскиваем ее адрес

  2. находим адрес нужной функции

  3. запускаем ее

Все это занимает приблизительно 6 ассемблерных команд – большие накладные расходы по сравнению с обычной командой. Вызов виртуальной функции гораздо более трудоемок, чем вызов невиртуальной функции.

Однако этими накладными расходами в большинстве случаев(если мы, конечно, не пишем собственный компилятор) можно пренебречь(не значит, однако, что нужно!).

Пример:

class X{ public:

virtual void f();

virtual void g();

virtual void h();

};

class Y:X{

void f();

virtual void g()=1;

virtual void h();

};

Как снять виртуальность? Можно просто ообратиться к методу как к статическому, и тогда вся виртуальность снимется.

Пример:

void g(){

X::f();

}

Пример:

рx->X::f(); //тут осуществляется именно доступ по конкретному известному адресу(привязка метода статическая).

Уточним, что такое замещение.

В Java понятия виртального метода вовсе нет – там все методы о определению связаны динамически. Из соображений эффективности компилятор может снять динамичесий вызов, подставив конкретный адрес, если он точно знает тип ссылки.

Пример:

Z z = new Z();

z.f(); //=> z.Z::f();

Как обстоит дело в остальных языках?

С++

Если на верхнем уровне метод определен как виртуальный, то все его замещения будут по определению виртуальными вне зависимости от наличия слова virtual перед определением функции.

А если функция была невиртуальной, а потом вдруг стала виртуальной:

void g();

………….

virtual void g();; //допустимо

X: void g();

Y: virtual void g();

Замечание.

Вместо невиртуальных функций можно всегда подставлть их тело в месте вызова с учетом переименования переменной(с виртуальными функциями так делать нельзя)

С#, Delphi

Виртуальность метода обрывается, если мы не указываем virtual в очередном переопределении.

сlass X {

public virtual void f() {}

};

class Y {

public void f() {} // ошибка.

};

Можно либо так:

сlass X {

public virtual void f() {}

};

class Y {

public virtual void f() {} // продолжаем цепочку

};

Либо так:

сlass X {

public virtual void f() {}

};

class Y {

public override void f() {} // заменить!

};

Если написать так:

сlass X {

public virtual void f() {}

};

class Y {

public override virtual void f() {} // то цепочка заместителей поменяется, но метод останется виртуальным

};

Также заметим, что при повторном написании virtual компилятор выдаст предупреждение(если нет замещения, а есть скрытие), чтобы избавиться от него – надо написать new.

Delphi

type X = class

……………….

procedure f() virtual;

………….

end;

type Y = class(X)

Возможные ситуации

procedure f();// ошибка

procedure f(); override;

procedure f(); overload

ADA 1995

Если есть параметр tегированного типа, для вызова есть специальные типы:

CWT – class wide types – классовый тип

Классовый тип – потенциально бесокнечное множество объектов, включающее все объекты класса Т и все производные объекта.

type T is tagged record …… end

T – класс, Т – классовый тип

type A is array (index range <>) of T;

X:A; //-ошибка!

X: A (range L..R); //нормально

X:T’

Тprocedure P (X: T);

T1procedure P (X: T1);

Представим, что существует некоторая глобальная процедура

procedure CALL(A : T); // P(A); -- P(X:T)

procedure CALLV (A : T’class) //P(A);

Тогда:

X: T;

Y:T1;

CALL(X); // - P(T)

CALL(Y); // - P(T)

CALLV(X); // - P(T)

CALLV(Y); // - P(T1)

Если речь идет о вызове классовго типа, то он может быть только динамический.

Замечание1. Вообще говоря, Ада наиболее близко подошла к концепции МУЛЬТИМЕТОДА(метода, связанного по нескольким параметрам). Тем не менее, из соображений эффективности он в ней не реализован.

Мультиметод – это метод, который вызывается в зависимости от динамического типа двух своих ссылок.

CALL_W(X:T’ class, Y: W’ class);

P(X, Y);

Пример использования мультиметодов можно легко привести из компьютерной графики: пересечение объектов – вызываем ту или иную функцию в зависимости от способов пресечения.

Мультиметоды есть, например, в языке CLOS(Common Lisp With Object Systems) – достаточно известный язык в довольно узких кругах.

Замечание 2. Оберон -2 отличается от Оберон тем, что в нем есть процедуры и динамическое приведение к типу – по определению аналог виртуальных методов.

Пример

TYPE T RECORD
……………………..

END;

TYPE T1 RECORD(T)
……………………..

END;

PROCEDURE(VAR X: T) P; //виртуаьная функция, Х передается как ссылка

Перекрытия нет, а замещение есть:

PROCEDURE(VAR X: T1) P; //динамическая(виртуальная) функция

VAR X: T;

Y: T1;

X.P; // -------------P(T)

Y.P; // --------------P(T1)

Вызывать таким образом можно лишь процедры, динамически привязанные к типу.

PROCEDURE CALL (VAR A: T); //обычная функция

Если имя функции написано после скобочек – функция виртуальная, если перед ним – то самая обычная.

//Здорово, да? 

Пример:

TYPE PT = POINTER TO T;

X: PT;

X = NEW(T);

X.P ------------------ вызовется PROCEDURE(VAR X: T) P; (процедура, динамически привязанная к типу Т)

X = NEW(T1);

X.P ------------------ вызовется PROCEDURE(VAR X: T1) P; (процедура, динамически привязанная к типу Т1)

Замечание 3

Запрет наследования – очень важный элемент в современных языках.

В C# наследование очень чато запрещается. Пример – закрытый класс Path.

В C# и Java предусмотрены специальные средства для запрета наследования: ключевые слова seаled и final.

Java

final - ставится перед классом, если класс является конечным в иерархии классов, то есть его нельзя наследовать

C#

sealed – «запечатанный» класс

Любой сатический класс в C#3.0 запечатан.

Слова final и sealed могут стоять и перед методами, означая запрет данного метода в наследних в Java и в C#(там sealed имеет смысл ставить только около виртуальных методов).

Sealed может стоять или перед определением, или перед замещением виртуального метода.

Характеристики

Тип файла
Документ
Размер
127,5 Kb
Тип материала
Высшее учебное заведение

Список файлов лекций

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6417
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее