polymorphism c
Улога полиморфизма у Ц ++ са примерима.
Полиморфизам је један од четири стуба објектно оријентисаног програмирања. Полиморфизам значи имати више облика. Може се дефинисати као техника којом предмет може имати различите облике у зависности од ситуације.
У програмском смислу, можемо рећи да се објекат може различито понашати у различитим условима.
У овом упутству ћемо научити о врстама полиморфизма, начинима примене полиморфизма заједно са разним другим концептима полиморфизма.
=> Погледајте овде да бисте видели А-З од Ц ++ туторијала за обуку овде.
На пример, жена може да преузме много улога у различитим ситуацијама. За дете је она мајка, домаћица код куће, радница у канцеларији итд. Дакле, жена преузима различите улоге и показује различито понашање у различитим условима. Ово је стварни пример полиморфизма.
Слично томе и у свету програмирања, можемо имати оператор „+“ који је бинарни оператер сабирања који се другачије понаша када се операнди промене. На пример, када су оба операнда нумеричка, он врши сабирање.
С друге стране, када су операнди низ, он делује као оператор спајања. Према томе, полиморфизам, укратко, значи ентитет који узима различите облике или се другачије понаша под различитим условима.
Шта ћете научити:
- Врсте полиморфизма
- Цомпиле Тиме Полиморпхисм Вс. Полиморфизам током извођења
- Саставите временски полиморфизам
- Преоптерећење функције
- Преоптерећење оператера
- Закључак
- Препоручено читање
Врсте полиморфизма
Полиморфизам се дели на две врсте.
- Саставите временски полиморфизам
- Полиморфизам током извођења
Дијаграм који то представља приказан је испод:
Као што је приказано на горњем дијаграму, полиморфизам се дели на полиморфизам током времена компајлирања и полиморфизам током извођења. Полиморфизам времена компајлирања даље се дели на преоптерећење оператора и преоптерећење функције. Рунтиме полиморфизам се даље примењује помоћу виртуелних функција.
Полиморфизам времена компајлирања познат је и као рани везујући или статички полиморфизам. У овој врсти полиморфизма, метода објекта се позива у време компајлирања. У случају полиморфизма времена извођења, метода објекта се позива у току извођења.
Полиморфизам током извођења познат је и као динамички или касни везујући или динамички полиморфизам. Детаљну примену сваке од ових техника размотрићемо у следећим темама.
Цомпиле Тиме Полиморпхисм Вс. Полиморфизам током извођења
Да видимо главне разлике између времена компајлирања и полиморфизма времена извођења у наставку.
Саставите временски полиморфизам | Полиморфизам током извођења |
---|---|
Такође познат као статички полиморфизам или рано везивање | Такође познат као динамички полиморфизам или касно / динамичко везивање |
Објецтс метода се позива у време компајлирања | Метода објекта се позива током извођења |
Обично се примењује помоћу преоптерећења оператора и преоптерећења функција | Имплементирано помоћу виртуелних функција и замене метода |
Преоптерећење метода је полиморфизам времена компајлирања у којем више од једне методе може имати исто име, али различиту листу параметара и типове. | Замена методе је полиморфизам времена извођења где више од једне методе има исто име са истим прототипом |
Пошто су методе познате у време компајлирања, извршавање је брже | Извршење је спорије јер је метода позната током извођења |
Обезбедите мање флексибилности за примену решења, јер све мора бити познато у време компајлирања | Далеко флексибилнији за примену сложених решења, јер се методе одлучују током извођења |
Саставите временски полиморфизам
Полиморфизам времена компилације је техника у којој се метода објекта позива у време компајлирања.
Ова врста полиморфизма спроводи се на два начина.
- Преоптерећење функције
- Преоптерећење оператера
Детаљно ћемо разговарати о свакој техници.
Преоптерећење функције
Каже се да је функција преоптерећена када имамо више функција са истим именом, али различитих типова параметара или различитим бројем аргумената.
Тако се функција може преоптеретити на основу типова параметара, редоследа параметара и броја параметара.
Имајте на уму да две функције које имају исто име и исту листу параметара, али различит тип повратка нису преоптерећене функције и резултираће грешком компилације ако се користе у програму.
Слично томе, када се параметри функције разликују само у показивачу и ако је тип низа еквивалентан, тада га не треба користити за преоптерећење.
Други типови попут статичких и нестатичних, цонст и волатиле итд. Или декларације параметара које се разликују у присуству или одсуству задатих вредности такође се не смеју користити за преоптерећење, јер су еквивалентне са становишта имплементације.
На пример,следећи прототипи функција су преоптерећене функције.
Add(int,int); Add(int,float); Add(float,int); Add(int,int,int);
У горњим прототиповима видимо да преоптерећујемо функцију Адд на основу врсте параметара, секвенце или редоследа параметара, броја параметара итд.
Узмимо комплетан Пример програмирања да бисмо боље разумели Преоптерећење функција.
#include #include using namespace std; class Summation { public: int Add(int num1,int num2) { return num1+num2; } int Add(int num1,int num2, int num3) { return num1+num2+num3; } string Add(string s1,string s2){ return s1+s2; } }; int main(void) { Summation obj; cout< Излаз:
35
191
19
Здраво Свете
У горњем програму имамо класу Сумматион која је дефинисала три преоптерећене функције под именом Адд која узима два целобројна аргумента, три целобројна аргумента и два стринг аргумента.
У главној функцији вршимо четири позива функције који пружају различите параметре. Прва два позива функције су једноставна. У трећем позиву функције Адд додајемо две вредности са покретном тачком као аргументе.
У овом случају, функција која се подудара је инт Адд (инт, инт), јер се интерно претвара у доубле, а затим подудара са функцијом са параметрима инт. Да смо навели доубле уместо флоат, тада бисмо имали још једну преоптерећену функцију са доубле као параметре.
Последњи позив функције користи вредности низа као параметре. У овом случају, оператер Адд (+) делује као оператор спајања и спаја две вредности низа да би произвео један низ.
Предности преоптерећења функције
Главна предност преоптерећења функције је што промовише поновну употребу кода. Можемо имати што више функција са истим именом све док су преоптерећене на основу типа аргумента, секвенце аргумената и броја аргумената.
На овај начин постаје лакше имати различите функције са истим именом које представљају понашање исте операције у различитим условима.
Да није било преоптерећења функције, тада бисмо морали да напишемо превише различитих врста функција са различитим именима, чинећи тако код нечитким и тешким за прилагодбу.
Преоптерећење оператера
Преоптерећење оператора је техника помоћу које дајемо различито значење постојећим операторима у Ц ++. Другим речима, преоптерећујемо операторе да бисмо дали посебно значење кориснички дефинисаним типовима података као објектима.
Већина оператора у Ц ++-у су преоптерећени или им се даје посебно значење тако да могу радити на кориснички дефинисаним типовима података. Имајте на уму да током преоптерећења основна операција оператора није промењена. Преоптерећење само даје оператору додатно значење задржавајући њихову основну семантику.
Иако се већина оператора може преоптеретити у Ц ++-у, постоје неки оператори који се не могу преоптеретити.
Ови оператори су наведени у доњој табели.
Оператори Оператор за резолуцију опсега (: :) Величина селектор члана (.) бирач показивача члана (*) тернарни оператор (? :)
Функције које користимо за преоптерећење оператора називају се „ Функције оператора ”.
Функције оператора су сличне нормалним функцијама, али са разликом. Разлика је у томе што назив функција оператора започиње кључном речи „ оператер ”Праћен симболом оператора који треба да буде преоптерећен.
Функција оператора се тада позива када се одговарајући оператор користи у програму. Ове функције оператора могу бити функције члана или глобалне методе или чак функција пријатеља.
Општа синтакса функције оператора је:
return_type classname::operator op(parameter list) { //function body }
Овде је „оператор оп“ функција оператора где је оператор кључна реч, а оп оператер који треба преоптеретити. Ретурн_типе је тип вредности који треба вратити.
Погледајмо неколико примера програмирања који демонстрирају преоптерећеност оператора помоћу оператерских функција.
Пример 1:Преоптерећење унарног оператора помоћу функције оператора члана.
#include using namespace std; class Distance { public: int feet; // Constructor to initialize the object's value Distance(int feet) { this->feet = feet; } //operator function to overload ++ operator to perform increment on Distance obj void operator++() { feet++; } void print(){ cout << '
Incremented Feet value: ' << feet; } }; int main() { Distance d1(9); // Use (++) unary operator ++d1; d1.print(); return 0; }
Излаз:
Повећана вредност стопала: 10
Овде смо преоптеретили унарни оператор прираста користећи функцију оператор ++. У главној функцији користимо овај ++ оператор да бисмо повећали објекат класе Дистанце.
Пример 2:Преоптерећење бинарног оператора помоћу функције оператора члана.
#include using namespace std; class Complex { int real, imag; public: Complex(int r = 0, int i =0) {real = r; imag = i;} //Operator function to overload binary + to add two complex numbers Complex operator + (Complex const &obj) { Complex c3; c3.real = real + obj.real; c3.imag = imag + obj.imag; return c3; } void print() { cout << real << ' + i' << imag << endl; } }; int main() { Complex c1(2, 5), c2(3, 7); cout<<'c1 = '; c1.print(); cout<<'c2 = '; c2.print(); cout<<'c3 = c1+c2 = '; Complex c3 = c1 + c2; // calls overloaded + operator c3.print(); }
Излаз:
ц1 = 2 + и5
ц2 = 3 + и7
ц3 = ц1 + ц2 = 5 + и12
Овде смо користили класични пример сабирања два сложена броја помоћу преоптерећења оператора. Дефинишемо класу која представља Комплексне бројеве и функцију оператора за преоптерећење + оператора у коју додајемо стварне и замишљене делове сложених бројева.
како додати низове у јави
У главној функцији декларишемо два сложена објекта и додајемо их помоћу преоптерећеног + оператора да бисмо добили жељени резултат.
У примеру испод, користићемо функцију пријатеља да додамо два сложена броја да бисмо видели разлику у примени.
#include using namespace std; class Complex { int real, imag; public: Complex(int r = 0, int i =0) {real = r; imag = i;} //friend function to overload binary + to add two complex numbers friend Complex operator +(Complex const &, Complex const &); void print() { cout << real << ' + i' << imag << endl; } }; Complex operator + (Complex const &c1, Complex const &c2) { Complex c3; c3.real = c1.real + c2.real; c3.imag = c1.imag + c2.imag; return c3; } int main() { Complex c1(2, 5), c2(3, 7); cout<<'c1 = '; c1.print(); cout<<'c2 = '; c2.print(); cout<<'c3 = c1+c2 = '; Complex c3 = c1 + c2; // calls overloaded + operator c3.print(); }
Излаз:
ц1 = 2 + и5
ц2 = 3 + и7
ц3 = ц1 + ц2 = 5 + и12
Видимо да је резултат програма исти. Једина разлика у имплементацији је употреба функције пријатеља за преоптерећење оператора + уместо функције члана у претходној имплементацији.
Када се за бинарни оператор користи функција пријатеља, морамо експлицитно навести оба операнда функције. Слично томе, када је унарни оператор преоптерећен коришћењем функције пријатеља, функцији морамо да дамо један операнд.
Поред функција оператора, можемо написати и оператор конверзије која се користи за претварање из једне врсте у другу. Ови преоптерећени оператори конверзије требали би бити функција члана класе.
Пример 3:Преоптерећење оператора помоћу оператора конверзије.
#include using namespace std; class DecFraction { int numerator, denom; public: DecFraction(int num, int denm) { numerator = num; denom = denm; } // conversion operator: converts fraction to float value and returns it operator float() const { return float(numerator) / float(denom); } }; int main() { DecFraction df(3, 5); //object of class float res_val = df; //calls conversion operator cout << 'The resultant value of given fraction (3,5)= '< Излаз:
Резултујућа вредност дате фракције (3,5) = 0,6
У овом програму користили смо оператор претворбе за претварање датог разломка у флоат вредност. Када се конверзија изврши, оператор конверзије враћа резултујућу вредност позиваоцу.
У главној функцији, када дф објекат доделимо променљивој рес_вал, конверзија се одвија и резултат се чува у рес_вал.
Конструктор такође можемо назвати једним аргументом. Када можемо позвати конструктор из класе користећи један аргумент, то се назива „ конверзија градитељ ”. Конструктор конверзије може се користити за имплицитну конверзију у класу која се конструише.
#include using namespace std; class Point { private: int x,y; public: Point(int i=0,int j=0) {x = i;y=j;} void print() { cout<<' x = '< Излаз:
Тачка конструисана помоћу нормалног конструктора
к = 20 и = 30
Тачка конструисана помоћу конструктора за конверзију
к = 10 и = 0

Овде имамо класу Поинт која дефинише конструктор са подразумеваним вредностима. У главној функцији конструишемо објекат пт са координатама к и и. Даље, пт само доделимо вредност 10. Овде се позива конструктор конверзије и к додељује вредност 10 док је и дата подразумевана вредност 0.
Правила преоптерећења оператера
Док вршимо преоптерећење оператера, морамо пазити на следећа правила.
- У Ц ++-у смо у могућности да преоптеретимо само постојеће операторе. Ново додати оператори не могу се преоптеретити.
- Када су оператори преоптерећени, морамо осигурати да је бар један од операнда кориснички дефинисан тип.
- Да бисмо преоптеретили одређене операторе, можемо користити и функцију пријатеља.
- Када преоптеретимо унарне операторе помоћу функције члана, то не узима никакве експлицитне аргументе. Потребан је један експлицитни аргумент када је унарни оператор преоптерећен помоћу функције пријатеља.
- Слично томе, када су бинарни оператори преоптерећени помоћу функције члана, функцији морамо пружити један експлицитан аргумент. Када су бинарни оператори преоптерећени помоћу функције пријатеља, функција узима два аргумента.
- У Ц ++-у постоје два оператора која су већ преоптерећена. То су „=“ и „&“. Због тога да бисмо копирали објекат исте класе, не треба преоптеретити оператор = и можемо га директно користити.
Предности преоптерећења оператера
Преоптерећење оператора у Ц ++-у омогућава нам да проширимо функционалност оператора на кориснички дефинисане типове, укључујући објекте класе поред уграђених типова.
Проширујући функционалност оператора на кориснички дефинисане типове, не треба нам писање сложеног кода за обављање различитих операција на кориснички дефинисаним типовима, али то можемо учинити у самој операцији, баш као и уграђени типови.
Закључак
Полиморфизам времена компајлирања пружа могућност преоптерећења углавном за проширење функционалности кода у смислу преоптерећења функција и преоптерећења оператора.
Преоптерећењем функције можемо написати више функција са истим именом, али различитим параметрима и типовима. Ово чини код једноставним и лако читљивим. Преоптерећењем оператора можемо проширити функционалност оператора, тако да можемо обављати основне операције и на кориснички дефинисаним типовима.
У нашем предстојећем упутству сазнаћемо више о полиморфизму извођења у Ц ++.
=> Прочитајте серију Еаси Ц ++ Траининг Сериес.
Препоручено читање
- Рунтиме полиморфизам у Ц ++
- Функције пријатеља у Ц ++
- Рекурзија у Ц ++
- Водич за главне функције Питхона са практичним примерима
- Комплетан преглед Ц ++
- КТП водич # 21 - Како направити КТП тестове модуларним и поновним коришћењем помоћу библиотека радњи и функција
- Водич за Уник цеви: Цеви у програмирању за Уник
- Библиотечке функције у Ц ++