Какво е полиморфизъм в C ++?
В C ++ полиморфизмът кара функцията на член да се държи по различен начин въз основа на обекта, който го извиква / извиква. Полиморфизмът е гръцка дума, която означава да има много форми. Това се случва, когато имате йерархия от класове, свързани чрез наследяване.
Да предположим например, че имаме функцията makeSound (). Когато котката извика тази функция, тя ще издаде мяукащ звук. Когато кравата извика същата функция, тя ще издаде звук на косене.
Въпреки че имаме една функция, тя се държи по различен начин при различни обстоятелства. Функцията има много форми; следователно сме постигнали полиморфизъм.
В този урок за C ++ ще научите:
- Какво е полиморфизъм?
- Видове полиморфизъм
- Компилирайте времевия полиморфизъм
- Претоварване на функцията
- Претоварване на оператора
- Полиморфизъм по време на изпълнение
- Замяна на функцията
- Виртуална функция на C ++
- Полиморфизъм по време на компилация Vs. Полиморфизъм по време на изпълнение
Видове полиморфизъм
C ++ поддържа два вида полиморфизъм:
- Полиморфизъм по време на компилация и
- Полиморфизъм по време на изпълнение.
Компилирайте времевия полиморфизъм
Извиквате претоварените функции, като съпоставяте броя и типа аргументи. Информацията присъства по време на компилация. Това означава, че компилаторът на C ++ ще избере правилната функция по време на компилация.
Полиморфизмът по време на компилация се постига чрез претоварване на функциите и претоварване на оператора.
Претоварване на функцията
Претоварването на функциите възниква, когато имаме много функции с подобни имена, но различни аргументи. Аргументите могат да се различават по отношение на брой или тип.
Пример 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;}
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в нашия код. Ще можем да използваме неговите функции.
- Включете std пространството от имена в нашия код. Ще можем да използваме класовете му, без да го извикваме.
- Създайте функция с име test, която приема цяло число параметър i. {Отбелязва началото на основния тест на функцията.
- Изявление, което трябва да се изпълни, ако горният функционален тест бъде извикан / извикан.
- Край на тялото на горния функционален тест.
- Създайте функция с име test, която приема параметър float f. {Отбелязва началото на основния тест на функцията.
- Изявление, което трябва да се изпълни, ако горният функционален тест бъде извикан / извикан.
- Край на тялото на горния функционален тест.
- Създайте функция с име test, която приема параметър на символа ch. {Отбелязва началото на основния тест на функцията.
- Изявление, което трябва да се изпълни, ако горният функционален тест бъде извикан / извикан.
- Край на тялото на горния функционален тест.
- Извикайте функцията main (). {Отбелязва началото на тялото на функцията.
- Извикайте функционалния тест и му предайте 5 като стойност на аргумента. Това извиква тестовата функция, която приема целочислен аргумент, т.е. първата тестова функция.
- Извикайте функционалния тест и предайте 5.5 като стойност на аргумента. Това ще извика тестовата функция, която приема аргумент с плаващ елемент, тоест втората тестова функция.
- Извикайте функционалния тест и му предайте пет като стойност на аргумента. Това ще извика тестовата функция, която приема аргумент за символ, т.е. третата тестова функция.
- Програмата трябва да върне стойност, ако работи успешно.
- Краят на тялото на основната () функция.
Имаме три функции с едно и също име, но различни видове аргументи. Постигнахме полиморфизъм.
Претоварване на оператора
В претоварването на оператора дефинираме ново значение за оператор C ++. Това също променя начина на работа на оператора. Например, можем да дефинираме оператора + за обединяване на два низа. Познаваме го като оператор за добавяне за добавяне на числови стойности. След нашата дефиниция, когато се постави между цели числа, тя ще ги добави. Когато се постави между низовете, той ще ги обедини.
Пример 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();}
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в нашата програма, за да използвате неговите функции.
- Включете std пространството от имена в нашата програма, за да използвате класовете му, без да го извиквате.
- Създайте клас с име ComplexNum. {Отбелязва началото на тялото на класа.
- Използвайте модификатора за частен достъп, за да маркирате променливите като частни, което означава, че те могат да бъдат достъпни само от класа.
- Определете две целочислени променливи, реална и над.
- Използвайте модификатора на публичния достъп, за да маркирате конструктора като публичен, което означава, че той ще бъде достъпен дори извън класа.
- Създайте конструктора на класа и инициализирайте променливите.
- Инициализирайте стойността на променливата real.
- Инициализирайте стойността на променливата над.
- Край на тялото на конструктора.
- Трябва да заменим значението на оператора +.
- Създайте резултата от типа данни от тип ComplexNum.
- Използвайте оператора + с комплексни числа. Този ред ще добави реалната част на число към реалната част на друго число.
- Използвайте оператора + с комплексни числа. Този ред ще добави въображаемата част от число към въображаемата част на друго число.
- Програмата ще върне стойността на резултата от променливата при успешно изпълнение.
- Край на дефиницията на новото значение на + оператор, т.е. претоварване.
- Извикайте метода print ().
- Отпечатайте новия комплексен номер след добавяне на конзолата.
- Край на функцията на тялото на print ().
- Край на тялото на клас ComplexNum.
- Извикайте функцията main ().
- Предайте стойностите както на реални, така и на сложни части, които трябва да се добавят. Първата част на c1 ще бъде добавена към първата част на c2, т.е. 10 + 3. Втората част на c1 ще бъде добавена към втората част на c, т.е. 2 + 7.
- Извършете операция, като използвате оператора за претоварване + и съхранявате резултата в променлива c3.
- Отпечатайте стойността на променлива c3 на конзолата.
- Край на тялото на main () функция.
Полиморфизъм по време на изпълнение
Това се случва, когато методът на обекта се извиква / извиква по време на изпълнение, а не по време на компилиране. Полиморфизмът по време на изпълнение се постига чрез заместване на функцията. Функцията, която трябва да бъде извикана / извикана, се установява по време на изпълнение.
Замяна на функцията
Заменянето на функцията възниква, когато на функция от базовия клас се даде нова дефиниция в производен клас. По това време можем да кажем, че основната функция е заменена.
Например:
#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;}
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Импортирайте заглавния файл на iostream в нашата програма, за да използвате неговите функции.
- Включете std пространството от имена в нашата програма, за да използвате класовете му, без да го извиквате.
- Създайте клас на име Mammal. {Отбелязва началото на тялото на класа.
- Използвайте модификатора за публичен достъп, за да зададете функцията, която предстои да създадем, като обществено достъпна. Той ще бъде достъпен извън този клас.
- Създайте публична функция на име eat. {Отбелязва началото на тялото на функцията.
- Отпечатайте изявлението, добавено към функцията cout, когато се извика функцията eat ().
- Краят на тялото на функцията яде ().
- Край на тялото на класа Бозайник.
- Създайте клас на име Cow, който наследява класа Mammal. Кравата е производният клас, докато бозайникът е основният клас. {Отбелязва началото на този клас.
- Използвайте модификатора за публичен достъп, за да маркирате функцията, която предстои да създадем, като обществено достъпна. Той ще бъде достъпен извън този клас.
- Заменете функцията eat (), дефинирана в основния клас. {Отбелязва началото на тялото на функцията.
- Изявлението за отпечатване на конзолата при извикване на тази функция.
- Край на тялото на функцията eat ().
- Край на тялото на класа Крава.
- Извикайте функцията main (). {Отбелязва началото на тялото на тази функция.
- Създайте екземпляр на класа Cow и му дайте името c.
- Извикайте функцията eat (), дефинирана в класа Cow.
- Програмата трябва да върне стойност при успешно завършване.
- Край на функцията main ().
Виртуална функция на C ++
Виртуалната функция е друг начин за внедряване на полиморфизъм по време на изпълнение в C ++. Това е специална функция, дефинирана в основен клас и предефинирана в производния клас. За да декларирате виртуална функция, трябва да използвате виртуалната ключова дума. Ключовата дума трябва да предшества декларацията на функцията в базовия клас.
Ако клас на виртуална функция се наследи, виртуалният клас предефинира виртуалната функция в съответствие с нейните нужди. Например:
#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();}
Изход:
Ето екранна снимка на кода:
Обяснение на кода:
- Включете заглавния файл на iostream в кода, за да използвате неговите функции.
- Включете std пространството от имена в нашия код, за да използвате класовете му, без да го извиквате.
- Създайте клас с име ClassA.
- Използвайте модификатора за публичен достъп, за да маркирате член на класа като обществено достъпен.
- Създайте виртуална функция с име show (). Това ще бъде публична функция.
- Текстът за отпечатване при извикване на show () е извикан. Endl е ключова дума на C ++, което означава краен ред. Премества курсора на мишката към следващия ред.
- Край на тялото на виртуалната функция show ().
- Край на тялото на класа ClassA.
- Създаване на нов клас с име ClassB, който наследява класа ClassA. ClassA се превръща в основен клас, докато ClassB се превръща в производен клас.
- Използвайте модификатора за публичен достъп, за да маркирате член на класа като обществено достъпен.
- Предефинирайте виртуалната функция show (), получена в базовия клас.
- Текстът за отпечатване на конзолата при извикване на функцията show (), дефинирана в производния клас.
- Край на тялото на функцията show ().
- Край на тялото на производния клас, ClassB.
- Извикайте функцията main (). Логиката на програмата трябва да бъде добавена в нейното тяло.
- Създайте указател на променлива с име a. Той сочи към класа с име ClassA.
- Създайте екземпляр на класа с име ClassB. На екземпляра се дава името b.
- Присвояване на съхраняваните стойности в адреса b в променливата a.
- Извикайте функцията show (), дефинирана в производния клас. Приложено е късно обвързване.
- Край на тялото на основната () функция.
Полиморфизъм по време на компилация Vs. Полиморфизъм по време на изпълнение
Ето основните разлики между двете:
Полиморфизъм по време на компилация | Полиморфизъм по време на изпълнение |
Нарича се още ранно свързване или статичен полиморфизъм | Нарича се още късно / динамично свързване или динамичен полиморфизъм |
Методът се извиква / извиква по време на компилация | Методът се извиква / извиква по време на изпълнение |
Реализирано чрез претоварване на функции и претоварване на оператора | Реализирано чрез заместване на метод и виртуални функции |
Пример, метод за претоварване. Много методи могат да имат сходни имена, но различен брой или видове аргументи | Пример, замяна на метода. Много методи могат да имат подобно име и същия прототип. |
По-бързо изпълнение, тъй като откриването на методи се извършва по време на компилация | По-бавно изпълнение, тъй като откривателят на методи се извършва по време на изпълнение. |
Осигурена е по-малка гъвкавост за решаване на проблеми, тъй като всичко е известно по време на компилиране. | Осигурена е голяма гъвкавост за решаване на сложни проблеми, тъй като методите се откриват по време на изпълнение. |
Резюме:
- Полиморфизмът означава да има много форми.
- Това се случва, когато има йерархия от класове, свързани чрез наследяване.
- При полиморфизма функцията може да се държи по различен начин въз основа на обекта, който я извиква / извиква.
- В полиморфизма по време на компилация функцията, която трябва да бъде извикана, се установява по време на времето на компилиране.
- В полиморфизма по време на изпълнение, функцията, която трябва да бъде извикана, се установява по време на изпълнение.
- Полиморфизмът по време на компилация се определя чрез претоварване на функциите и претоварване на оператора.
- При претоварването на функции има много функции с подобни имена, но различни аргументи.
- Параметрите могат да се различават по брой или тип.
- При претоварване на оператора е дефинирано ново значение за операторите C ++.
- Полиморфизмът по време на изпълнение се постига чрез заместване на функцията.
- При замяна на функция, производен клас дава нова дефиниция на функция, дефинирана в основния клас.