Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
39.86 Кб
Скачать

31) Перегрузка функций

Имеется возможность описывать разные алгоритмы для одного и того же идентификатора функции при разных количествах и наборах типов входных параметров. Такое описание разных алгоритмов в одной зоне описания (класс, пространство имен) называется перегрузкой функций (если описание разных алгоритмов для одного и того же имени осуществляется в разных зонах, то говорят о перекрытии).

При вызове функции для выбора подходящей перегруженной функции выполняется следующий алгоритм:

Алгоритм поиска оптимально отождествляемой функции

1) Отбираются функции с необходимым количеством формальных параметров.

Описания, содержащиеся в библиотечном файле <cstdarg>, становятся доступными после его подключения директивой препроцессора #include <cstdarg>.

Такой метод используется при передаче списка строковых параметров из командной строки вызова программы на исполнение:

int main(int argc, char* argv[])

Здесь args – количество строковых параметров в командной строке вызова программы на исполнение, включая идентификатор программы.

2) Для каждого фактического параметра вызова функции строится множество функций, оптимально отождествляемых по этому параметру (best matching)

3) Находится пересечение этих множеств

4) Если полученное множество состоит из одной функции, то вызов разрешим. Если множество пусто или содержит более одной функции, то генерируется сообщение об ошибке.

Пример:

class x{

. . .

public:

x(int i1){. . . }

. . .

};

class y{. . .};

void f(x x1, int i1){. . .}

void f(x x1, double d1){. . .}

void f(y y1, double d1){. . .}

void g(){. . . f(1,1) . . .} // вызов первой реализации

f(x, int)

Пример:

class x{

. . .

public:

x(int i1){. . . }

. . .

};

void f(x x1, int i1){. . .}

void f(int i1, x x1){. . .}

void g(){. . . f(1,1) . . .} // ошибка: пересечение // множеств – пусто.

37) Закрытое (private) наследование

Закрытые члены базового класса недоступны напрямую с использованием дополнительных методов класса-наследника (при любом способе наследования). Работа внутри класса-наследника с такими получаемыми закрытыми членами базового класса возможна только с использованием открытых и защищенных методов базового класса.

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

При закрытом наследовании открытые и защищенные члены базового класса (любые) доступны только внутри производного класса и недоступны извне (через объекты производного класса), как и его собственные закрытые члены.

Пример:

class X1{

int ix1;

public:

int f1(){ . . . }

. . . };

class Y1: protected X1 {

. . . };

class Z1: public Y1 {

. . . };

class X2{

protected:

int ix2;

public:

int f2(){ . . . }

. . . };

class Y2: X2 {. . .};

class Z2: public Y2 {. . .};

Пример: Базовый класс описывает фигуры на плоскости и имеет методы вычисления площади фигур, а класс-наследник описывает объемные тела, например, призмы с основанием – плоской фигурой, описываемой базовым классом. Поэтому в данном случае не имеет смысла наследование методов базового класса для работы с объектами, описываемыми классом-наследником:

#include <iostream>

using namespace std;

class twom {

double x,y;

public:

twom(double x1=1, double y1=1): x(x1), y(y1) {}

double sq(){

return x*y; } };

class thm: private twom {

double z;

public:

thm(double x1 = 1, double y1 = 1,

double z1 = 1):twom(x1,y1), z(z1){}

double vol(){return sq()*z;} };

int main(){

thm t1(1,2,3);

double d1;

d1 = t1.vol();

cout << "vol= " << d1 << '\n';

return 0; }

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