
- •5. Объекты и их жизненный цикл. Создание и уничтожение объектов. Алгоритм реализации в .Net освобождения памяти.
- •6. Инкапсуляция. Свойства. Функциональное назначение. Реализация. Создание индексатора. Примеры применения.
- •8. Инкапсуляция. Скрытие членов класса.
- •15. Перегрузка методов. Функциональное назначение. Способ реализации. Примеры применения.
- •16. Виртуальные методы. Функциональное назначение. Примеры применения.
- •17. Перегрузка операций. Функциональное назначение. Способ реализации. Примеры применения.
- •18. Управление областями видимости членов класса. Функциональное назначение. Способ реализации. Примеры применения.
- •Вопрос 19.
- •Вопрос 20
- •Вопрос 21
15. Перегрузка методов. Функциональное назначение. Способ реализации. Примеры применения.
Перегруженные методы - это методы, которые находятся в том же самом классе и имеют то же самое имя, но различные списки параметров. Переопределённые методы - это методы, которые находятся в суперклассе так же как и в подклассе. Полиморфизм - свойство использования одного имени для задания общих для класса действий. Выполнение каждого конкретного действия будет определяться типом данных. Следующая программа демонстрирует перезагруженные методы. Пример 5: class Calculation { public void add( int a, int b) { int с = a + b; System.out.println( Addition of two integers is + c); } public void add( float a, float b) { float с = a + b; System.out.println( Addition of two floating point numbers is +c); } public void add( String a, String b) { String с = a + b; System.out.println( Addition of two strings is + c); } } class CalculationDemo { public static void main(String args[]) { Calculation с = new Calculation(); с add(10,20) ; c.add(40.0F, 35.65F); с.add( Good , Morning ); } }
При вызове перегруженного метода для определения нужной версии Java использует тип и/или количество аргументов метода. Следовательно, перегруженные методы должны различаться по типу и/или количеству их параметров. Хотя возвращаемые типы перегруженных методов могут быть различны, самого возвращаемого типа не достаточно для различения двух версий метода. Когда Java встречает вызов перегруженного метода, она просто выполняет ту его версию, параметры которой соответствуют аргументам, использованным в вызове.
16. Виртуальные методы. Функциональное назначение. Примеры применения.
Виртуальный метод (виртуальная функция) — в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.
Виртуальные методы — один из важнейших приёмов реализации полиморфизма. Они позволяют создавать общий код, который может работать как с объектами базового класса, так и с объектами любого его класса-наследника. При этом базовый класс определяет способ работы с объектами и любые его наследники могут предоставлять конкретную реализацию этого способа. В некоторых языках программирования, например в Java, нет понятия виртуального метода, данное понятие следует применять лишь для языков, в которых методы родительского класса не могут быть переопределены по умолчанию, а только с помощью некоторых вспомогательных ключевых слов. В некоторых же (как, например, в Python), все методы — виртуальные.
/* Здесь ссылка на базовый класс используется для доступа к виртуальной функции */ #include <iostream.h> class Base { public: virtual void who() { // определение виртуальной функции cout << "Base\n"; } }; class first_d: public Base { public: void who () { // определение who() применительно к first_d cout << "First derivation\n"; } }; class second_d: public Base { public: void who() { // определение who() применительно к second_d cout << "Second derivation\n*"; } }; // использование в качестве параметра ссылки на базовый класс void show_who (Base &r) { r.who(); } int main() { Base base_obj; first_d first_obj; second_d second_obj; show_who (base_ob j) ; // доступ к who класса Base show_who(first_obj); // доступ к who класса first_d show_who(second_obj); // доступ к who класса second_d return 0; }