ВУЗ:
Составители:
Рубрика:
основана на механизме позднего связывания, в отличие от раннего связывания,
характерного для обычных методов. Позднее связывание основано на
вычислении адреса вызываемого метода при выполнении программы. Адрес
вычисляется по хранящемуся в каждом объекте описателю типа. Виртуальные
методы позволяют в полной мере реализовать идею полиморфизма.
Разница между виртуальным и динамическим методами заключается в
особенностях создаваемых таблиц и, как следствие, в разной скорости работы.
Встретив метод, объявленный как виртуальный или динамический, компилятор
создаёт таблицу DMT (Dinamic Method Table) или VMT (Virtual Method Table) и
помещает в неё адреса точек входа соответственно динамического или
виртуального методов. При каждом обращении к замещаемому методу
компилятор вставляет код, позволяющий извлечь адрес точки входа в
подпрограмму из той или иной таблицы. Когда в классе-потомке встречается
метод, объявленный с директивой
override, компилятор создаст код, который
на этапе прогона программы поместит в родительскую таблицу точку входа
метода класса-потомка, что позволит родителю выполнить нужное действие с
помощью нового метода. Таблица динамических методов содержит адреса
только тех методов, которые объявлены как
dynamic в данном классе, в то
время как таблица VMT содержит адреса виртуальных методов не только
данного метода, но и всех его родителей. Значительно большая по размеру
таблица VMT обеспечивает более быстрый поиск. При использовании
динамического метода программа сначала просматривает таблицу DMT у
объекта, а затем у его родительского класса и так далее, пока не будет найдена
нужная точка входа.
При построении иерархии классов часто возникает ситуация, когда работа
виртуального метода в базовом классе неизвестна и наполняется содержанием
только в потомках. В этом случае метод объявляется абстрактным. После слова
virtual записывается директива abstract, что исключает необходимость
написания кода для виртуального метода.
105
основана на механизме позднего связывания, в отличие от раннего связывания,
характерного для обычных методов. Позднее связывание основано на
вычислении адреса вызываемого метода при выполнении программы. Адрес
вычисляется по хранящемуся в каждом объекте описателю типа. Виртуальные
методы позволяют в полной мере реализовать идею полиморфизма.
Разница между виртуальным и динамическим методами заключается в
особенностях создаваемых таблиц и, как следствие, в разной скорости работы.
Встретив метод, объявленный как виртуальный или динамический, компилятор
создаёт таблицу DMT (Dinamic Method Table) или VMT (Virtual Method Table) и
помещает в неё адреса точек входа соответственно динамического или
виртуального методов. При каждом обращении к замещаемому методу
компилятор вставляет код, позволяющий извлечь адрес точки входа в
подпрограмму из той или иной таблицы. Когда в классе-потомке встречается
метод, объявленный с директивой override, компилятор создаст код, который
на этапе прогона программы поместит в родительскую таблицу точку входа
метода класса-потомка, что позволит родителю выполнить нужное действие с
помощью нового метода. Таблица динамических методов содержит адреса
только тех методов, которые объявлены как dynamic в данном классе, в то
время как таблица VMT содержит адреса виртуальных методов не только
данного метода, но и всех его родителей. Значительно большая по размеру
таблица VMT обеспечивает более быстрый поиск. При использовании
динамического метода программа сначала просматривает таблицу DMT у
объекта, а затем у его родительского класса и так далее, пока не будет найдена
нужная точка входа.
При построении иерархии классов часто возникает ситуация, когда работа
виртуального метода в базовом классе неизвестна и наполняется содержанием
только в потомках. В этом случае метод объявляется абстрактным. После слова
virtual записывается директива abstract, что исключает необходимость
написания кода для виртуального метода.
105
Страницы
- « первая
- ‹ предыдущая
- …
- 103
- 104
- 105
- 106
- 107
- …
- следующая ›
- последняя »
