Основы работы в С++
Методическое пособие - Компьютеры, программирование
Другие методички по предмету Компьютеры, программирование
меняется в тех случаях, когда множественное наследование вместо предполагаемой полной композиции свойств классов-предков приводит к ограничению доступных наследуемых свойств вследствие неоднозначности. Базовый класс, наследуемый множественно, определяется виртуальным с помощью ключевого слова virtual.
) Виртуальное наследование не является явной характеристикой самого базового класса, а лишь описывает его отношение к производному. Как мы уже отмечали, виртуальное наследование - это разновидность композиции по ссылке. Иначе говоря, доступ к подобъекту и его нестатическим членам косвенный, что обеспечивает гибкость, необходимую для объединения нескольких виртуально унаследованных подобъектов базовых классов в один разделяемый экземпляр внутри производного. В то же время объектом производного класса можно манипулировать через указатель или ссылку на тип базового, хотя последний является виртуальным
Лабораторная работа №6
Тема: Виртуальные функции
Цели работы:
? исследование полиморфизма;
? изучение принципов позднего связывания;
? изучение виртуальных функций;
? полиморфизм ad-hoc;
? реализация виртуальных функций;
? изучение абстрактных классов.
Задания
Вариант 1
Создать абстрактный базовый класс Worker с виртуальной функцией начисления зарплаты. Создать производные классы StateWorker, HourlyWorker и CommissionWorker, в которых данная функция переопределена.
#includenamespace std;worker {:i;(double x) {i=x;}void func() {cout<< zarplata standartnogo rabochego<<endl;<<i;}
};stateworker:public worker {:(double x):worker(x){}func() {cout<< zarplata stateworker<<endl;<<i*1.5<<endl;}};
horlyworker:public worker {:(double x):worker(x){}func() {<< zarplata horlyworker;<<i*2<<endl;
}};communicationworker:public worker {:(double x):worker(x){}func() {coutfunc(); 0;
}
класс шаблон виртуальный оператор
Контрольные вопросы
) В общем случае полиморфизм представляет собой способность объекта изменять форму. Если вы разделите этот термин на части, то обнаружите, что поли означает много, а морфизм относится к изменению формы. Полиморфный объект, следовательно, представляет собой объект, который может принимать разные формы. Этот урок вводит понятие полиморфизма и рассматривает, как использовать полиморфные объекты внутри ваших программ для упрощения и уменьшения кода. К концу данного урока вы освоите следующие основные концепции:
Полиморфизм представляет собой способность объекта изменять форму во время выполнения программы.++ упрощает создание полиморфных объектов.
Для создания полиморфных объектов ваши программы должны использовать виртуальные (virtual) функции.
Виртуальная (virtual) функция - это функция базового класса, перед именем которой стоит ключевое слово virtual.
Любой производный от базового класс может использовать или перегружать виртуальные функции.
Для создания полиморфного объекта вам следует использовать указатель на объект базового класса.
) Виртуальный метод (виртуальная функция) - в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.
Переопределение метода (англ. Method overriding) в объектно-ориентированном программировании - одна из возможностей языка программирования, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет (заменяет) его реализацию в суперклассе, описывая метод с тем же названием, что и у метода суперкласса, а также у нового метода подкласса должны быть те же параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса
) При позднем связывании адреса определяются динамически во время выполнения программы, а не статически во время компиляции, как в традиционных компилируемых языках, в которых применяется раннее связывание. Сам процесс связывания заключается в замене виртуальных функций на адреса памяти.