Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 14
На сайте нет зарегистрированных пользователей

Пользователей: 13,361
новичок: uehuat
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Расчет мер близости на отношениях на Delphi + Пояснительная записка
Моделирование системы управления качеством производственного процесса на...
Моделирование процесса обработки заданий на вычислительном центре на GP...

Определение виртуальных функций
Получается, что в С++ должен существовать механизм, с помощью которого можно узнать тип объекта во время выполнения программы. Такой механизм в С++ есть, и он, как уже отмечалось, называется динамической идентификацией типов (RTTI). Однако в ситуациях, подобных описанным, применяется другой, более «сильный» и элегантный механизм С++ — механизм виртуальных функций (см. п. 10.3 в [1]).
Чтобы добиться разного поведения в зависимости от типа, необходимо объявить функцию-метод виртуальной; в С++ это делается с помощью ключевого слова virtual. Таким образом, в листинге 9.1 объявление метода f () в базовом и производном классах должно быть таким:
virtual int f(const int &d) // в базовом классе
{ return 2*d; } '
virtual int f(const int &d) // в производном классе
{ return d*d; }



После этого для объектов базового и производного классов мы получаем разные результаты: 11 и 26.
Аналогично в листинге 9.2 объявление метода printO тоже должно начинаться со слова vi rtual:
virtual void printO const // в базовом классе
{ cout << "Clock!" << endl; }
virtual void printO const // в производном классе
{ cout << "Alarm!" << endl; }



После этого вызов sett i me О с параметром базового класса обеспечит нам вывод на экран слова «С1оск», а с параметром производного класса — слова «А1агт». И при вызове по указателю наблюдается та же картина.
Вообще-то ключевое слово vi rtual достаточно написать только один раз — в объявлении функции базового класса. Определение можно писать без слова vi rtual — все равно функция будет считаться виртуальной. Однако лучше всегда это делать явным образом, чтобы всегда по тексту было видно, что функция является виртуальной.
Для виртуальных функций обеспечивается не статическое, а динамическое (позднее, отложенное) связывание, которое реализуется во время выполнения программы. Естественно, это влечет за собой некоторые накладные расходы, однако на них можно не обращать внимания, так как обеспечивается динамический полиморфизм. Александреску в [20] указывает, что в С++ реализованы два типа полиморфизма:
• статический полиморфизм, или полиморфизм времени компиляции (compile-time polymorphism), осуществляется за счет перегрузки и шаблонов функций;
• динамический полиморфизм, или полиморфизм времени выполнения (runtime polymorphism), реализуется виртуальными функциями.
С перегрузкой функций «разбирается» компилятор, правильно подбирая вариант функции в той или иной ситуации. И полиморфизм шаблонных функций тоже реализуется на этапе компиляции. Естественно, выбор осуществляется статически. Выбор же виртуальной функции происходит динамически — при выполнении программы. Класс, включающий в себя виртуальные функции, называется полиморфным.
Правила описания и использования виртуальных функций-методов следующие:
1. Виртуальная функция может быть только методом класса.
2. Любую перегружаемую операцию-метод класса можйо сделать виртуальной, например, операцию присваивания или операцию преобразования типа.
3. Виртуальная функция, как и сама виртуальность, наследуется.
4. Виртуальная функция может быть константной.
5. Если в базовом классе определена виртуальная функция, то метод производного класса с такими же именем и прототипом (включая тип возвращаемого значения и константность метода) автоматически является виртуальным (слово vi rtual указывать необязательно) и замещает функцию-метод базового класса.
6. Конструкторы не могут быть виртуальными.
7. Статические методы не могут быть виртуальными.
8. Деструкторы могут (чаще — должны) быть виртуальными — это гарантирует корректный возврат памяти через указатель базового класса.
Опубликовал Kest November 21 2013 01:38:05 · 0 Комментариев · 4609 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
Игра Car [Исходни...
Защита от спама ...
Просмотр файлов и...
JBlabel3D
Halcyon
Cтатьи Королевств...
Работа с базами д...
PrevInst
GamesBase 3.0
Распознавание иде...
Х. М. Дейтел, П. ...
AVIwriter
CoolHints2k
Gold Submitter II...
Программирование ...
Панель случайной ...
WAP версия сайта
Философия C++. Пр...
Программирование ...
Delphi 2005 для .NET

Топ загрузок
Приложение Клие... 100772
Delphi 7 Enterp... 97809
Converter AMR<-... 20261
GPSS World Stud... 17014
Borland C++Buil... 14189
Borland Delphi ... 10267
Turbo Pascal fo... 7372
Калькулятор [Ис... 5972
Visual Studio 2... 5206
Microsoft SQL S... 3661
Случайные статьи
Разновидности прот...
Физические явления...
Процедуры и функци...
— снижение рисков ...
Чтение меток NFC
Суммирование элем...
Игровой видео слот...
Точность инфографи...
Интерфейс TPI
7.3. Ханойские башни
Казино Вулкан
Официальный сайт С...
Содержание
Разделение памяти ...
Введение в триггеры
0 доWindows 2000Ко...
Назначение класса ...
Статические элемен...
Файловые системы
Постановка задачи ...
Режим многоадресно...
Функция Port Security
Упорядочивание пар...
Официальный сайт S...
Игровые слоты кази...
Статистика



Друзья сайта
Программы, игры


В конце всего обучения с водителем-инструктором по вождению, каждый человек.. Первые два этапа можно смело считать основами обучения вождению, так как они подразумевают усовершенствование навыков автомобильного вождения на учебной дороге. Это позволяет будущему водителю, как следует освоить принцип вождения, овладев такими механизмами, как старт, поворот и тормоз. Водитель должен четко осознавать последовательность всех действий, чтобы в будущем у него не возникало никаких проблем с управлением автомобиля.
Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?