Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР20-С++-16-сентября-2012 (1).doc
Скачиваний:
33
Добавлен:
12.11.2019
Размер:
1.18 Mб
Скачать

1.12. Полиморфизм

Полиморфизм – это принцип ООП, позволяющий включать в состав класса несколько функций с одинаковыми именами, но выполняющих различные действия. Такие функции должны иметь различные списки параметров, они должны отличаться или количеством параметров в списках, или типами соответствующих параметров. Полиморфизм в ООП есть проявление свойства языка C++, называемого перегрузкой функций (рассмотрим позднее в ЛР 24).

Пример 20.19

Пример полиморфизма – класс графических примитивов Draw. Класс может проявить себя как текст, прямоугольник или окружность. Для этого в класс включены три метода show(), различающиеся параметрами.

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

//Пример 20.19

#include <string.h>

#include <iostream.h>

#include <conio.h>

class Draw

{

int x1, y1, x2, y2, r;

char *message;

public:

Draw();

virtual ~Draw();

void show();

void show(int xx1, int yy1, int xx2, int yy2);

void show(int xx1, int xx2, int rr);

};

Draw::Draw()

{

x1=x2=y2=y1=r=0;

message=new char[10];

strcpy(message, "Text");

}

Draw::~Draw()

{

delete[] message;

message=NULL;

}

void Draw::show()

{

cout << message << endl;

}

void Draw::show(int xx1,int yy1,int xx2,int yy2)

{

cout << "Rectangle" << endl;

}

void Draw::show(int xx1,int xx2,int rr)

{

cout << "Circle" << endl;

}

int main(void)

{

Draw draw;

draw.show();

draw.show(1,1,20,10);

draw.show(10,10,10);

cout << "\nНажмите любую клавишу..." ;

getch();

return 0;

}

В результате выполнения программы на экране появляются сообщения:

Text

Rectangle

Circle

1.13. Указатель this

Указатель this – это скрытая внутренняя переменная каждого объекта, неявно используется внутри методов для ссылок на элементы объекта.

Каждая нестатическая (не имеющая спецификатора static) функция-элемент имеет доступ к объекту, для которого вызвана, через ключевое слово this. Указатель this является указателем на тип_класса *.

Указатель this инициализируется при определении объекта класса (каждый объект класса при создании получает значение указателя на начало, выделенной ему памяти).

*this – операция разыменования для получения значения объекта.

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

Выражение this –> имя_члена обеспечивает доступ к члену конкретного объекта (данному или функции) в приватной памяти объекта.

Дружественным функциям указатель this не передается.

Работа методов с полями именно того объекта, для которого они были вызваны, обеспечивается неявной передачей в функцию параметра this, в котором хранится константный указатель на вызвавший функцию объект.

Модификация указателя this в функциях класса недопустима.

Пример 20.20.

class simple

{ public:

simple();

void greet() { cout<<“ Hello!”;};

};

simple::simple()

{ greet(); // вызов

this>greet(); // функции

(*this).greet(); // greet()

}

Т.к. функции-элементы могут обращаться ко всем элементам класса просто по имени, в основном указатель this используется для возвращения указателя (return this) или ссылки (return *this) на подразумеваемый объект.