Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_YaSiTP_III_attesattsia_II_semestr.docx
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
74.37 Кб
Скачать
  1. Классы. Принцип полиморфизма. Перегрузка методов в классах-наследниках.

Объектно-ориентированное программирование основано на идее объединения данных и процедур их обработки, создания формальной связи между ними.

Способ создания такой связи подобен тому, что используется для агрегирования простых переменных в структуры, а именно, создание пользовательских типов – классов, включающих, как данные, так и процедуры их обработки.

При таком подходе к проектированию программных средств модель предметной области строится в виде наборов объектов (экземпляров класса) – программных аналогов существующих в ней предметов и процес сов.

Под полиморфизмом понимается способность объекта видоизменять свое поведение в течение времени своего существования.

Для этого класс, экземпляром которого является данный объект, удовлетворял следующим требованиям :

  • имел два или более класса-наследника

  • имел один или более виртуальных метода

Перегрузкой методов называется изменение выполняемого методом действия при сохранении его имени.

В пределах одного класса перегрузка может быть выполнена только путем изменения сигнатуры метода, т.е. набора его формальных параметров

Однако, методы базового класса могут быть перегружены в классах-наследниках с сохранением их сигнатур. Такая перегрузка достигается путем связывания имени метода с именем класса, т.е. уточнения того, метод какого класса должен быть выполнен в данном вызове.

Например, в базовом классе Base и в каждом из его потомков Student и Employee определены методы с одинаковым именем и сигнатурой – void print():

class Base //базовый класс

{

Person p;

public:

Base(void); //конструктор класса

~Base(void); //деструктор класса

Person get(); //методы класса

int put(Person);

void print();

};

class Employee : public Base //класс-наследник

{

char post[30];

public:

Employee(double);

~Employee(void);

int get_post(char &x);

int put_post(char x[]);

void print(); //перезагружаемый метод

};

class Student : public Base //класс-наследник

{

short year;

public:

Student(void);

~Student(void);

short get_year();

int put_year(short);

void print();//перезагружаемый метод

};

2. Статическое и динамическое связывание имени метода с именем класса.

Различают два вида связывания:

  • статическое (совершаемое на этапе компиляции);

  • динамическое (совершаемое на этапе выполнения программы);

При статическом связывании выбор перегружаемого метода основан на информации о типе объекта, вызывающего метод.

При динамическом связывании этот выбор основывается на информации о значении указателя, используемого для вызова метода.

Недостатки статического связывания:

  • Тип объекта должен определять программист, а не компилятор;

  • Программа с использованием статического связывания привязана к деталям реализации иерархии классов, поэтому любое изменение этой иерархии потребует изменения текста программы;

Динамическое связывание возможно только при использовании указателей на объекты. Указателю на объект базового класса может быть присвоено значение адреса объекта производного класса. Это, однако, не означает, что тем самым открывается доступ ко всем элементам объекта производного класса. Доступ открывается только к некоторым методам производного класса. Каждый такой метод должен быть определен в базовом классе и переопределен в производном классе с тем же именем, тем же типом возвращаемого значения и той же сигнатурой.

Заголовок метода в базовом классе должен включать спецификатор virtual. Иначе говоря, указатель, имеющий тип базового класса, может быть использован только для доступа к виртуальным методам этого класса.

Например, статическое связывание, связываем метод put(Person) с классом Base:

class Base //базовый класс

{

Person p;

public:

Base(void); //конструктор класса

~Base(void); //деструктор класса

Person get(); //методы класса

int put(Person);

void print();

};

int Base::put(Person x) //описываем метод

{

if (x.age && strcmp(x.firstname,"") && strcmp(x.lastname,""))

{

p = x;

return 0;

}

else

return 1;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]