Шта је полиморфизам у Ц ++?
У Ц ++, полиморфизам узрокује да се функција члана понаша другачије на основу објекта који је позива / позива. Полиморфизам је грчка реч која значи имати много облика. Појављује се када имате хијерархију класа повезаних наслеђивањем.
На пример, претпоставимо да имамо функцију макеСоунд (). Када мачка позове ову функцију, произвест ће звук мијаука. Када крава позове исту функцију, она ће створити звук кошње.
Иако имамо једну функцију, она се понаша другачије под различитим околностима. Функција има много облика; отуда смо постигли полиморфизам.
У овом упутству за Ц ++ научићете:
- Шта је полиморфизам?
- Врсте полиморфизма
- Саставите временски полиморфизам
- Преоптерећење функције
- Преоптерећење оператера
- Рунтиме полиморфизам
- Замена функције
- Ц ++ виртуелна функција
- Време компилације полиморфизам вс. Полиморфизам током извођења
Врсте полиморфизма
Ц ++ подржава две врсте полиморфизма:
- Полиморфизам компајлираног времена и
- Полиморфизам током извођења.
Саставите временски полиморфизам
Преоптерећене функције позивате подударањем броја и врсте аргумената. Информације су присутне током времена компајлирања. То значи да ће компајлер Ц ++ одабрати праву функцију у време компајлирања.
Полиморфизам компајлираног времена постиже се преоптерећењем функција и преоптерећењем оператера.
Преоптерећење функције
Преоптерећење функције се дешава када имамо много функција са сличним именима, али различитим аргументима. Аргументи се могу разликовати у погледу броја или врсте.
Пример 1:
#includeusing namespace std;void test(int i) {cout << " The int is " << i << endl;}void test(double f) {cout << " The float is " << f << endl;}void test(char const *ch) {cout << " The char* is " << ch << endl;}int main() {test(5);test(5.5);test("five");return 0;}
Излаз:
Ево снимка екрана кода:
Објашњење кода:
- Укључите датотеку заглавља иостреам у наш код. Моћи ћемо да користимо његове функције.
- Укључите стд простор имена у наш код. Моћи ћемо да користимо његове класе без позивања.
- Направите функцију названу тест која узима целобројни параметар и. Ознака {означава почетак испитивања тела функције.
- Изјава коју треба извршити ако се позове / позове горњи тест функције.
- Крај тела горњег функционалног теста.
- Направите функцију названу тест која узима флоат параметар ф. Ознака {означава почетак испитивања тела функције.
- Изјава коју треба извршити ако се позове / позове горњи тест функције.
- Крај тела горњег испитивања функције.
- Направите функцију названу тест која узима параметар карактера цх. Ознака {означава почетак испитивања тела функције.
- Изјава коју треба извршити ако се позове / позове горњи тест функције.
- Крај тела горњег испитивања функције.
- Позовите главну () функцију. Ознака {означава почетак тела функције.
- Позовите тест функције и проследите му 5 као вредност аргумента. Ово позива тест функцију која прихвата целобројни аргумент, односно прву тест функцију.
- Позовите тест функције и проследите му 5.5 као вредност аргумента. Ово ће позвати тест функцију која прихвата флоат аргумент, односно другу тест функцију.
- Позовите тест функције и проследите му пет као вредност аргумента. Ово ће позвати тест функцију која прихвата аргумент карактера, односно трећу тест функцију.
- Програм мора вратити вредност ако се успешно изводи.
- Крај тела главне () функције.
Имамо три функције са истим именом, али различите врсте аргумената. Постигли смо полиморфизам.
Преоптерећење оператера
У Преоптерећењу оператора дефинишемо ново значење за Ц ++ оператора. Такође мења начин рада оператора. На пример, можемо дефинисати + оператор који спаја два низа. Знамо га као оператор сабирања за додавање нумеричких вредности. После наше дефиниције, када се стави између целих бројева, додаће их. Када се ставе између низова, то ће их спојити.
Пример 2:
#includeusing namespace std;class ComplexNum {private:int real, over;public:ComplexNum(int rl = 0, int ov = 0) {real = rl;over = ov;}ComplexNum operator + (ComplexNum const &obj) {ComplexNum result;result.real = real + obj.real;result.over = over + obj.over;return result;}void print() {cout << real << " + i" << over << endl;}};int main(){ComplexNum c1(10, 2), c2(3, 7);ComplexNum c3 = c1+c2;c3.print();}
Излаз:
Ево снимка екрана кода:
Објашњење кода:
- Укључите датотеку заглавља иостреам у наш програм како бисте користили његове функције.
- Укључите стд простор имена у наш програм како бисте користили његове класе без позивања.
- Направите класу названу ЦомплекНум. Ознака {означава почетак предавања.
- Користите модификатор приватног приступа да означите променљиве као приватне, што значи да им се може приступити само из класе.
- Дефинишите две целобројне променљиве, реалну и преко.
- Користите модификатор јавног приступа да бисте конструктор означили као јавни, што значи да ће му бити доступан и изван класе.
- Креирајте конструктор класе и иницијализујте променљиве.
- Иницијализујте вредност променљиве реал.
- Иницијализујте вредност променљиве преко.
- Крај тела конструктора.
- Морамо да заменимо значење + оператора.
- Направите резултат типа података типа ЦомплекНум.
- Користите оператор + са сложеним бројевима. Овај ред ће додати стварни део броја стварном делу другог броја.
- Користите оператор + са сложеним бројевима. Ова линија додаће замишљени део броја замишљеном делу другог броја.
- Програм ће вратити вредност променљиве резултата након успешног извршења.
- Крај дефиниције новог значења + оператора, односно преоптерећења.
- Позовите методу принт ().
- Одштампајте нови сложени број након додавања на конзолу.
- Крај функције боди оф принт ().
- Крај тела класе ЦомплекНум.
- Позовите главну () функцију.
- Проследи вредности реалних и сложених делова које треба додати. Први део ц1 биће додат првом делу ц2, односно 10 + 3. Други део ц1 биће додат другом делу ц, односно 2 + 7.
- Извршите операцију помоћу преоптерећеног + оператора и чување резултата у променљивој ц3.
- Испишите вредност променљиве ц3 на конзоли.
- Крај тела главне () функције.
Рунтиме полиморфизам
То се дешава када се метода објекта позива / позива током времена извршавања, а не током времена компајлирања. Полиморфизам током извођења постиже се надјачавањем функције. Функција коју треба позвати / позвати успоставља се током извођења.
Замена функције
Замена функције се дешава када се функцији основне класе да нова дефиниција у изведеној класи. У то време можемо рећи да је основна функција замењена.
На пример:
#includeusing namespace std;class Mammal {public:void eat() {cout << "Mammals eat… ";}};class Cow: public Mammal {public:void eat() {cout << "Cows eat grass… ";}};int main(void) {Cow c = Cow();c.eat();return 0;}
Излаз:
Ево снимка екрана кода:
Објашњење кода:
- Увезите датотеку заглавља иостреам у наш програм да бисте користили његове функције.
- Укључите стд простор имена у наш програм како бисте користили његове класе без позивања.
- Направите класу с именом Сисари. Ознака {означава почетак предавања.
- Помоћу модификатора јавног приступа поставите функцију коју ћемо створити као јавно доступну. Биће му доступан изван ове класе.
- Направите јавну функцију под називом јести. Ознака {означава почетак тела функције.
- Одштампајте изјаву додану функцији цоут када се позове функција еат ().
- Крај тела функције јести ().
- Крај тела класе Сисари.
- Направите класу по имену Крава која наслеђује класу Сисари. Крава је изведена класа, док је сисар основна класа. {Означава почетак ове наставе.
- Користите модификатор јавног приступа да бисте функцију коју ћемо створити означили као јавно доступну. Биће му доступан изван ове класе.
- Замени функцију еат () која је дефинисана у основној класи. Ознака {означава почетак тела функције.
- Изјава за испис на конзоли када се позове ова функција.
- Крај тела функције еат ().
- Крај тела класе Крава.
- Позовите главну () функцију. Ознака {означава почетак тела ове функције.
- Направите инстанцу класе Цов и дајте јој име ц.
- Позовите функцију еат () дефинисану у класи Цов.
- Програм мора вратити вредност након успешног завршетка.
- Крај главне () функције.
Ц ++ виртуелна функција
Виртуелна функција је други начин примене рун-тиме полиморфизма у Ц ++. То је посебна функција дефинисана у основној класи и редефинисана у изведеној класи. Да бисте прогласили виртуелну функцију, требало би да користите виртуелну кључну реч. Кључна реч треба да претходи декларацији функције у основној класи.
Ако се класа виртуелне функције наследи, виртуелна класа редефинише виртуелну функцију у складу са својим потребама. На пример:
#includeusing namespace std;class ClassA {public:virtual void show() {cout << "The show() function in base class invoked… " << endl;}};class ClassB :public ClassA {public:void show() {cout << "The show() function in derived class invoked… ";}};int main() {ClassA* a;ClassB b;a = &b;a->show();}
Излаз:
Ево снимка екрана кода:
Објашњење кода:
- Укључите датотеку заглавља иостреам у код да бисте користили његове функције.
- Укључите стд простор имена у наш код да бисте користили његове класе без позивања.
- Направите класу под називом ЦлассА.
- Користите модификатор јавног приступа да бисте члана класе означили као јавно доступан.
- Креирајте виртуелну функцију која се зове схов (). То ће бити јавна функција.
- Текст за штампање када се позове схов (). Ендл је кључна реч Ц ++, што значи крајњи ред. Премешта курсор миша у следећи ред.
- Крај тела виртуелне функције схов ().
- Крај тела класе ЦлассА.
- Креирање нове класе под називом ЦлассБ која наслеђује класу ЦлассА. ЦлассА постаје основна класа, док ЦлассБ постаје изведена класа.
- Користите модификатор јавног приступа да бисте члана класе означили као јавно доступан.
- Редефинишите виртуелну функцију схов () изведену у основној класи.
- Текст за испис на конзоли када се позове функција схов () дефинисана у изведеној класи.
- Крај тела функције схов ().
- Крај тела изведене класе, ЦлассБ.
- Позовите главну () функцију. Програмска логика треба да се дода унутар њеног тела.
- Направите променљиву показивача под називом а. Указује на класу названу ЦлассА.
- Направите инстанцу класе под називом ЦлассБ. Инстанци је дато име б.
- Додели складишта вредности на адреси б у променљивој а.
- Позовите функцију схов () дефинисану у изведеној класи. Примењено је касно везивање.
- Крај тела главне () функције.
Време компилације полиморфизам вс. Полиморфизам током извођења
Ево главних разлика између њих двоје:
Полиморфизам компајлираног времена | Полиморфизам током извођења |
Такође се назива рано везивање или статички полиморфизам | Такође се назива касно / динамичко везивање или динамички полиморфизам |
Метода се позива / позива током времена компајлирања | Метода се позива / позива током времена извођења |
Имплементирано преко преоптерећења функције и преоптерећења оператера | Имплементирано преко замене метода и виртуелних функција |
Пример, преоптерећење методе. Многе методе могу имати слична имена, али различит број или врсте аргумената | Пример, замена методе. Многе методе могу имати слично име и исти прототип. |
Брже извршавање јер се откривање метода врши током времена компајлирања | Спорије извршавање јер се откривач метода врши током извођења. |
Пружа се мање флексибилности за решавање проблема, јер је све познато током времена компајлирања. | Много флексибилности је обезбеђено за решавање сложених проблема пошто се методе откривају током извођења. |
Резиме:
- Полиморфизам значи имати више облика.
- Појављује се када постоји хијерархија класа повезаних наслеђивањем.
- Са полиморфизмом, функција се може понашати другачије на основу објекта који је позива / позива.
- У полиморфизму времена компајлирања, функција на коју се позива успоставља се током времена компајлирања.
- У полиморфизму извршавања, функција на коју се позива је успостављена током времена извршавања.
- Полиморфизам компајлираног времена одређује се преоптерећењем функције и преоптерећењем оператора.
- У преоптерећењу функција постоји много функција са сличним именима, али различитим аргументима.
- Параметри се могу разликовати по броју или типу.
- У преоптерећењу оператора, ново значење је дефинисано за Ц ++ операторе.
- Полиморфизам током извођења постиже се надјачавањем функције.
- У надјачавању функције, изведена класа даје нову дефиницију функцији дефинисаној у основној класи.