• Първи вид: Полиморфизъм по отношение на структурата/формата/ “чист полиморфизъм”
  • представлява способността на обекти (представители на различни типове) да отговарят на едни и същи съобщения
  • позволява обекти с различна структура/поведение да се управляват по единен начин (могат да реагират по свой специфичен начин при получаване на едно и също съобщение)

от гледна точка на абстракцията на различни нива:

Абстракция на ниско ниво: моделиране на някакви конкретни преобразувания – например над точно определена структура от данни (вмъкване на елемент в списък, разместване на елементи на масив и т.н.)

Абстракция на високо ниво: проектиране, при което не се вземат предвид детайлите (начини за обхождане на списък, сортиране на масив и т.н.)

Чистият полиморфизъм дава възможност да се опише алгоритъмът веднъж на високо ниво на абстракция и след това да се използва многократно с различни абстракции от ниско ниво

  • Втори вид: Полиморфизъм по отношение на поведението/“натоварване”/полиморфизъм “ad-hoc” (за специална цел, специален):
  • способността на един и същи обект да отговаря на едно и също съобщение по различен начин
  • за обектите от даден клас, една и съща характеристика на поведението има няколко различни реализации (няколко метода с едно и също име)
  • Трети вид: Параметричен (parametric) полиморфизъм/шаблонен (templete)/пораждащ(generic)/с широко приложение:
  • представлява механизъм за изграждане на отделни модули, които са с общо предназначение и поради това могат да бъдат използвани  в различен контекст от различни клиенти
  • модулите с общо предназначение могат да представят структури от данни или алгоритми (пораждащи)
  • модулите с общо предназначение се наричат шаблони (templates)
  • шаблонът е програмен код, който съдържа части с общо предназначение. Той показва на компилатора, как замествайки тези части с общо предназначение с конкретен код (обикновено – конкретен тип), да построи конкретен изпълним програмен код
  • в С++ могат да се използват шаблонни класове и функци

Полиморфен код  и полиморфни подпрограми и програмиране в MS Visual C++

–        Полиморфен код:

Чистият полиморфизъм дава възможност обекти с различна структура да се обработват с един и същи програмен код (т.е. типът на обработваните обекти не е известен по време на компилация на програмата и дори може още и изобщо да не е деклариран). Такъв код се нарича полиморфен код

–        Полиморфни подпрограми:

  • подпрограми, които могат да приемат като параметър обекти с различна структура
  • позволяват да се описват алгоритми с високо ниво на абстракция
  • обикновено включват предаване на съобщения между обекти, изискващи динамично свързване при изпълнение на съответните методи, които от своя страна се определят на по-ниско ниво на абстракция за различните класове

Чистият полиморфизъм се нарича още включващ полиморфизъм, защото обект от един клас може да замества (да се включва на мястото на) обект от друг клас

Полиморфизъм в С++

В С++:

  • Реализация на всички видове полиморфизъм
  • Полиморфизъм по отношение на поведението се реализира като се предвидят няколко различни реализации на даден метод (т. е. методи с едно и също име)
  • Чист полиморфизъм:

–        Като резултат от разгледаните правилата за заделяне на памет и съвместимост на обектовите типове, чистият полиморфизъм може да се постигне или като следствие на съвместимостта между указатели към обекти (както и псевдоними на обекти), или като следствие от съвместимостта при предаване на параметри

–        Тъй като това е език със статичен тип на променливите, полиморфните обекти могат да бъдат само обекти от една и съща йерархия от класове

  • Параметричен (parametric) полиморфизъм може да се реализира чрез шаблонни класове и функции

Параметричен (parametric) полиморфизъм шаблонни класове

В C++ могат да се дефинират параметризирани класове, чийто параметър е някакъв тип. Такива класове се наричат шаблони шаблонни класове (class templates)

  • Същност:

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

–        при създаването на различни конкретни варианти на параметризирания клас тази информация за типа може да бъде попълнена по различни начини (по подобие на механизма на предаване на параметри на функции)

–        по този начин  на базата на шаблона могат да се генерират различни конкретни типове данни

Чрез шаблонните класове можем да проектираме един клас, който може да оперира с данни от различни типове, вместо да създаваме отделни класове за всеки един от тези типове

  • Правила:

–        шаблонните класове могат да са производни или да се наследяват, както от шаблонен, така и от обикновен клас

–        ако обикновен клас наследява  шаблонeн клас, то в неговата декларация параметризираните типове трябва да получат конкретни стойности

–        могат да участват в приятелски връзки

СИНТАКСИС

template < [списък_параметри ] > декларация_на _клас

–   списък_параметри е списък от типове (от вида class идентификатор или обикновени параметри, които се използват в тялото на шаблона   (име_на_тип идентификатор )

–   декларация_на _клас има познатия синтаксис

  • Пример:

template <class T, int i> class TempClass

{

public:

TempClass( void );

~TempClass( void );

int MemberSet( T a, int b );

private:

T Tarray[i];

int arraysize;

};

–        шаблонният клас има два параметъра  тип T и int i

–        при създаване на конкретен клас по този шаблон на мястото на:

  • T може да бъде подаден всеки тип, включително struct и class (дори и шаблонен клас)
  • i може да бъде подадена цяла константа (i може да се използва напр. за размер на масив при дефиниране на поле-масив)

Параметричен полиморфизъм шаблонни функции

  • Същност:

Шаблонните функции дават възможност да се дефинира множество от функции, които са базирани върху един и същи код, но обработват различни типове (класове)

  • Правила:

–        Член-функции могат да се дефинират като шаблони

  • Синтаксис:

template < [списък_параметри ] >  декларация_на _ф-я

  • Пример:

template <class T> void MySwap( T& a, T& b )

{

T c( a );

a = b; b = c;

}

Подобни статии

  • Програмиране на C/C++. Примерна задача
    автор: Димитър Димитров Условие: Дадени са четири редици от произволни цели числа. Максималният брой N на числата във всяка редица е различен, но стойността му е: 5≤N≤10. Напишете програма, с която: Да се определи броя на четните числа във всяка редица и определи в коя от тях той е най-малък...
  • Delphi и Програмен език Object Pascal
    Преди създаването на Delphi, Borland вече бяха въвели някои подобрения в езика Pascal и всъщност бяха разработили Object Pascal. Съотнесен към стандартният език Pascal, Object Pascal е това което е С++ спрямо стандартният език С. Object Pascal добави класове към стандартният език и по този начин го ...
  • Сигурност на данните (Data security)
    Сигурността на данните установява едно смесване на политика и криптиране. Криптирането на данните където се създават и съхраняват и предаването им през мрежата се препоръчва като най-добрата практика и ако всички други мерки са сигурност са излезли от строя (или са преодолени) една силна криптираща ...
  • Основи на Информационните Технологии. Въпроси и отговори
    Какво се губи при дискретизиране на информация и защо? При променяне на вида на файла или неговата компресия се получава дискретизиране на информацията и се губи част от информацията. Кои основни информационни дейности не могат да се извършат чрез компютър? Всичките четири основни информационни д...
  • Основни положения при програмиране на ММ с CPU
    Работата на машини с CPU се управлява по предварително съставена програма, наречена управляваща програма (УП). Тя дава необходимата информация за обработване на даден детайл. Програмиране се нарича процесът на създаване на УП. То може да бъде ръчно или автоматизирано с помощта на компютър. Съвременн...