Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C-fakepathELEMENT PROGRAMMIROVANIYA LAST.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.01 Mб
Скачать

Void message();

};

person :: person()

{

strcpy(name, "Noname");

}

Void person::message()

{

cout << "My name is " << name << endl;

}

Таким образом, в класс-наследник student теперь включены два метода message, имеющие одинаковый тип и одинаковый список параметров – один из базового класса, другой – собственный. Собственный метод доступен через имя объекта. Однако можно получить доступ к унаследованному методу, если использовать для доступа к методу указатель соответствующего типа – указатель на базовый класс:

int main(void)

{

person A;

student B("Ann", "SS,SK,VT");

A.message();

B.message();

person* pperson = &B;

pperson->message();

student* pstudent = &B;

pstudent->message();

return 0;

}

На экране увидим сообщения:

Noname Сообщение об= объекте A

Ann SS,SK,VT Сообщение об объекте B (используется

собственный метод message)

Ann Сообщение об объекте B (используется

метод message, полученный по наследству)

Ann SS,SK,VT Сообщение об объекте B (используется

собственный метод message)

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

Виртуальная функция - это функция, объявленная в базовом классе с помощью ключевого слова virtual, такая функция в классах-потомках замещается на функцию, принадлежащую производному классу и имеющую то же имя:

class person

{

protected:

char name[20];

public:

person();

virtual void message();

};

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

Noname Сообщение об объекте A

Ann SS,SK,VT Сообщение об объекте B (используется

собственный метод message)

Ann SS,SK,VT Сообщение об объекте B (используется

собственный метод message)

Ann SS,SK,VT Сообщение об объекте B (используется

собственный метод message)

С помощью виртуальных функций можно создать класс-наследник, имеющий тот же интерфейс, что и базовый класс, но обладающий своей собственной моделью поведения. Механизм виртуальных функций реализуется следующим образом: обычно обработка вызовов функций выполняется на этапе компиляции и завершается на этапе редактирования связей, когда вызов метода жестко связывается с соответствующей функцией (раннее связывание); если метод объявлен как виртуальный, выполняется так называемое позднее связывание, т. е. связывание вызова и функции во время выполнения программы.

52. Вопрос . Полиморфизм

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

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

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

#include <string.h>

#include <iostream.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);

return 0;

}

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

Text

Rectangle

Circle

Другой пример

#include <iostream.h>

#include <math.h>

class farida {

public:

// illustrasiya polimorfizma

int a;

int b;

virtual int vag1(int s) { a=2*s+8;return(a);}

int vag2 (int s) { b=2*s*s+4*s;return(b);}

} ;

class aytan :public farida

{

public:

int a;

int b;

int vag1(int s,int q) { a=2*s+8+q;return(a);}

int vag1 (int s) { b=2*s*s+4*s;return(b);}

} ;

farida rr; farida t[5];

aytan * z=new aytan;

aytan * w=new aytan;

farida * x =new farida;

farida * y=new farida;

main ()

{ int d,c,g,h;

rr.a=55;cout<<rr.a; t[0].a=77;cout<<t[0].a;

c= x->vag2(1);d= x->vag1(2);x->a=1;g=z->vag1(1,2);cout<<g<<endl;

h=w->vag1(1);cout<<h<<endl;

c=x->a; cout<<c<<endl;

if (x->a==x->b )

cout<<x->vag1(2) ;

else

cout<<y->vag2(6);

delete x;delete y;

}

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