Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Антонюк и др.doc
Скачиваний:
61
Добавлен:
07.11.2018
Размер:
32.99 Mб
Скачать

Перегрузка методов класса.

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

Пример:

class module

{

public:

int mod(int n){return abs(n);}

double mod(double n){return fabs(n);}

};

void main()

{

module m;

int a=-10;

cout<<m.mod(a);

double b=-1.5;

cout<<m.mod(b);

}

Перегрузка операций.

Для класса можно определить свои собственные операции. Такая возможность называется перегрузкой операций. Можно перегружать все арифметические и логические операции, операции присваивания, квадратные и круглые скобки, операции new и delete.

Синтаксис метода, перегружающего операцию:

ВозвращаемыйТип operator перегружаемаяОперация(параметры){код}

Пример:

coins coins::operator+(coins a)

{

coins res;

res.number=this->number+a.number;

return res;

}

Практическое задание.

Вариант A.

Разработайте класс "Вектор", определите набор основных операций между ними. Умножение векторов  определите как скалярное произведение векторов и в эвклидовой метрике в :

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

Вариант В.

Разработайте класс "Комплексное число", определите набор основных операций между ними и исследуйте в какие точки переводятся точки фигуры

преобразованиями

Вариант C.

См. вариант B. Для преобразований:

    1. Производные классы. Полиморфизм

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

Любой класс может быть родительским, и любой производный класс будет следовать его описанию. Класс-потомок может иметь дополнительные возможности по сравнению с базовым классом. В производном классе можно изменить права доступа, добавить новые элементы или перегрузить имеющиеся методы.

Синтаксис производного класса:

class ИмяПроизводногоКласса:(public/private/protected)

ИмяРодительскогоКласса {. . . };

Слова public, private и protected являются ключами доступа методов производного класса к элементам родительского класса. Ключ public не меняет тип доступа, ключ private делает для всех элементов базового класса тип доступа private, ключ protected разрешает доступ методов производного класса к общим элементам базового класса, но запрещает доступ для всех других методов. Если необходимо некоторым элементам изменить тип доступа, то их объявляю в производном классе повторно в соответствующей секции.

Если производный класс имеет всего один родительский класс, то такое наследование называется простым, в противном случае наследование называется сложным. Пример сложного наследования:

class A{. . .};

class B{. . .};

class C:public A, protected B{. . .};

Виртуальные функции

Функция–элемент может быть объявлена как virtual. В этом случае при ее вызове с указателем базового класса будет вызываться функция производного класса, если она переопределена.

Пример:

Class Base

{

public:

virtual void virt(){cout<<”From Base, virt.”;}

void nonVirt(){cout<<”From Base, non virt.”;}

};

class Derived:public Base

{

public:

void virt(){cout<<”From Deriver, virt.”;}

void nonVirt(){cout<<”From Derived, non virt.”;}

};

void main()

{

Base *bp=new Derived;//Базовый указатель ссылается на произв.

bp_>virt();//Вызов виртуальной ф-ции произв. класса.

bp_>nonVirt();//Вызов невиртуальной ф-ции базового класса.

}

Виртуальный механизм можно обойти, если при вызове указать имя класса с операцией разрешения видимости:

bp_>Base::virt();//Вызов виртуальной ф-ции произв. класса.

Свойство базового класса взаимодействовать с виртуальными функциями производного класса называется полиморфизмом. Компилятор не может определить заранее, какая функция должна вызываться на самом деле. В результате, это определяется во время выполнения с помощью таблицы виртуальных переходов. Эту особенность называют поздним связыванием.

Виртуальная функция в базовом классе может быть определена как чистая. Для этого необходимо вместо кода этой функции написать “=0”. Класс, содержащий подобные функции называется абстрактным. Для такого класса невозможно создать представителя класса. Производный класс обязан содержать описание чистой функции.