Навигация
Главная
Поиск
Форум
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
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Модуль Forms 65535
Имитационное мо... 59465
Реклама
Сейчас на сайте
Гостей: 3
На сайте нет зарегистрированных пользователей

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

Обработка задач на ЭВМ на GPSS + Пояснительная записка
Моделирование процесса обработки заданий на вычислительном центре на GP...
Моделирование процесса обеспечивающего надежность функционирования АСУ Т...

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Определение виртуальных функций
Получается, что в С++ должен существовать механизм, с помощью которого можно узнать тип объекта во время выполнения программы. Такой механизм в С++ есть, и он, как уже отмечалось, называется динамической идентификацией типов (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 05:38:05 · 0 Комментариев · 3302 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
Самоучитель PHP 5...
Программа для рис...
Алгоритм DES шифр...
Андрей Боровский....
ZipForge
THttpScan v4.1
Billenium Effects...
Система баннеро-о...
ICQ
MxProtector
Calendar
mmmJlabel
WordReport
Пример работы с б...
Degisy Data Acces...
Алгоритмы шифрова...
Prolog Interprete...
Rotolabel
Панель "Случайное...
Экспорт базы данн...

Топ загрузок
Приложение Клие... 100512
Delphi 7 Enterp... 90258
Converter AMR<-... 20092
GPSS World Stud... 14994
Borland C++Buil... 12711
Borland Delphi ... 8944
Turbo Pascal fo... 7093
Калькулятор [Ис... 5129
Visual Studio 2... 5018
FreeSMS v1.3.1 3554
Случайные статьи
Как был взломан AL...
Стандартные числов...
"=" expected
4.3.2. Комбинаци...
наследования ОГП
Разработка своими ...
Предсказуемость во...
Исключения и дестр...
TRACE (НАЧАТЬ ТРАС...
СПОСОБЫ РАСПОЗНАВА...
«Security Planning»
Где душевые кабины...
Руководитель долже...
Действия пользователя
Как это может рабо...
В типичной реализа...
Программирование с...
необходимы
Опыт оптимизации
Оформление текстов...
Генератор списков ...
Объявление указателей
Разделение памяти ...
Как расколоть орешек
Реализация активно...
Статистика



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


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