Виртуалната функция е функция член, която е дефинирана в базовия клас / родителския клас и е предефинирана в производния клас. Виртуалната функция позволява извикване на версията на производния клас на функцията, използвайки препратката или указателя към основния клас.
Нека да видим няколко примера за разбиране на концепцията за виртуална функция.
В първия пример ще видим поведението на невиртуалната функция, а след това във втория пример ще обясним поведението на виртуална функция.
Пример 1
В следния примерен код имаме два класа: базов клас и производен клас.
Основният клас има функция член, т.е.д., дисплей (). Полученият клас се наследява от базовия клас и предефинира функцията display ().
След това декларирахме указател към типа на базовия клас и му присвоихме обект от производния клас. Така че, когато извикаме функцията display (), използвайки указателя на типа на базовия клас, ще бъде извикана функцията на основния клас. Можете да видите изхода по-долу.
Но в такива случаи C ++ предоставя начин за извикване на производната функция на класа чрез деклариране на функцията на базовия клас като виртуална. Ще видим друг пример, за да разберем това.
#includeизползване на пространство от имена std;
клас Base_Class
публично:
показване на празнота ()
Cout << "I am in Base class" << endl;
;
клас Derived_Class: публичен Base_Class
публично:
показване на празнота ()
Cout << "I am in Derived class"
Пример 2
В този пример дефинирахме функцията display () като виртуална функция в базовия клас. Единствената разлика от предишната програма е, че сме добавили виртуална ключова дума пред “void display ()” в основния клас.
Сега, ако видите изхода, той отпечатва „Аз съм в производен клас”, което показва, че функцията на производен клас се извиква.
Виртуалната ключова дума (виртуална функция) в основния клас е отговорна да гарантира, че правилната функция е извикана за обект.
#includeизползване на пространство от имена std;
клас Base_Class
публично:
дисплей за виртуална празнота ()
Cout << "I am in Base class" << endl;
;
клас Derived_Class: публичен Base_Class
публично:
показване на празнота ()
Cout << "I am in Derived class"
Пример 3
Това е друг пример за виртуална функция. Както можете да видите в програмата по-долу, ние определихме основен клас, т.е.д., Животно. Има два производни класа: Куче и Крава. Дефинирали сме функцията eat () като виртуална в базовия клас, т.е.д., Животно. След това сме предефинирали функцията eat () и в двата производни класа, Dog и Cow. Във функцията main () имаме указател на базовия клас, т.е.д., Animal и след това прикрепи производния клас, Dog. Така че, когато извикаме функцията eat () с помощта на показалеца на базовия клас, можем да извикаме производната версия на клас на функция eat (), i.д., функцията eat () от клас Dog. По същия начин, когато прикачим обекта на клас Cow, можем да извикаме производната версия на клас на функцията eat (), i.д., функцията eat () от класа Cow. Можете ясно да видите това поведение в изхода по-долу.
#includeизползване на пространство от имена std;
клас Животно
публично:
виртуална празнота яде ()
Cout << "Animal - base class - undefined eating behavior." << endl;
;
клас Куче: обществено животно
публично:
празно яде ()
Cout << "Dog - eat non-veg!" << endl;
;
клас Крава: обществено животно
публично:
празно яде ()
Cout << "Cow - eat veg!"
a_ptr-> яде ();
връщане 0;
Заключение
В тази статия обясних концепцията за виртуална функция в C++. C ++ поддържа различни видове полиморфизъм - статичен и динамичен полиморфизъм. С помощта на виртуална функция можем да постигнем времето на изпълнение / динамичния полиморфизъм. В тази статия разгледахме само концепцията за виртуална функция и как да постигнем полиморфизъм по време на изпълнение. Обясних три работни примера за обяснение на виртуалната функция.