Разлика между виртуална и чиста виртуална функция

Автор: Laura McKinney
Дата На Създаване: 2 Април 2021
Дата На Актуализиране: 8 Може 2024
Anonim
Виртуальные методы класса c++. Ключевое слово virtual. Ключевое слово override. ООП. C++ #103
Видео: Виртуальные методы класса c++. Ключевое слово virtual. Ключевое слово override. ООП. C++ #103

Съдържание


Виртуалната функция и чистата виртуална функция и двете са понятията полиморфизъм на времето за изпълнение. Основната разлика между „виртуална функция “ и „Чиста виртуална функция“ е, че „виртуалната функция“ има своето определение в базовия клас и също така наследствените производни класове я предефинират. Чистата виртуална функция няма дефиниция в базовия клас и всички наследствени производни класове трябва да я предефинират.

Въпреки това, виртуалната функция се нарича още като динамично изпращане и изпращане на време, тъй като извикнатата функция е посочена във времето на изпълнение в съответствие с типа на използвания обект.

Полиморфизмът се поддържа от двата езика C ++ и Java. В Java терминът "отменяне" се използва вместо "виртуална функция", тъй като виртуалната функция е терминът C ++.

  1. Сравнителна диаграма
  2. дефиниция
  3. Ключови разлики
  4. заключение

Сравнителна диаграма

Основа за сравнениеВиртуална функцияЧиста виртуална функция
ОсновенВиртуалната функция има своето определение в базовия клас.Pure Virtual Function няма определение в базовия клас.
декларациявиртуално име на функция (параметър_ списък) {. , , , .};виртуално име на функция (параметър_ списък) = 0;
Получен класВсички производни класове могат или не могат да отменят виртуалната функция на базовия клас.Всички производни класове трябва да отменят виртуалната функция на базовия клас.
ефект

Виртуалните функции имат йерархичен характер; тя не влияе на компилацията, ако производни класове не отменят виртуалната функция на базовия клас.Ако всички производни класове не успеят да отменят виртуалната функция на базовия клас, ще възникне грешка при компилация.
Абстрактен класНяма концепция.Ако клас съдържа поне една чиста виртуална функция, тогава той се декларира абстрактно.


Дефиниция на виртуална функция

Най- виртуална функция е член-функцията на базовия клас и се предефинира от производни класове, които наследяват базовия клас. Не е необходимо всички наследствени производни класове да предефинират виртуалната функция, тя се предефинира само от тези производни класове, които могат да изискват нейното функциониране. Виртуална функция се създава чрез деклариране на функцията в базовия клас, предшестван с ключовата дума 'виртуален'.

Декларация:

клас база {public: виртуален тип funt_name (параметър-списък) {. , , }};

Наследствените производни класове могат да дефинират виртуалната функция без никаква „виртуална“ ключова дума. Получените класове предефинират виртуалната функция, за да изпълнят задачата си. Тъй като виртуалната функция се предефинира в производни класове, имаме множество форми на една и съща функция. Сега коя версия на функцията се извиква, зависи от това какъв вид обект е отнесен да извика тази функция.


Многостепенно наследяване

При многостепенно наследяване, когато производен клас, който е наследил виртуалната функция от своя базов клас, когато самият той се използва като базов клас за друг производен клас, виртуалната функция все още може да бъде отменена. И така, когато виртуалната функция е наследствена, нейната виртуална природа също се наследява.

Виртуалните функции също са йерархични по своя характер, т.е. ако производен клас не отменя / предефинира виртуалната функция, наследена от базовия клас и когато обектът на производен клас извиква тази виртуална функция, тогава виртуалната функция, определена от базовия клас, се извиква.

Определение за чиста виртуална функция

Както се вижда по-горе, ако производен клас не отменя виртуалната функция, тогава се използва виртуалната функция, дефинирана от базовия клас. Но какво ще стане, ако самият базов клас не дефинира виртуалната функция. Много пъти базовият клас няма определение за виртуалната функция или понякога искате всички производни класове да превъзмогнат виртуалната функция.

За да се справи с тези по-горе две ситуации, C ++ поддържа концепцията за „Чиста виртуална функция". „Чиста виртуална функция“ е декларирана в базовия клас, но няма нейното определение в базовия клас. Чистата виртуална функция се декларира по следния начин.

виртуален тип funct_name (параметър_ списък) = 0;

Всеки път, когато виртуалната функция в базовия клас е направена „чиста“, тогава всеки производен клас задължително трябва да отмени чистата виртуална функция на базовия клас. Ако полученият клас не успее да отмени чистата виртуална функция на базовия клас, това ще доведе до грешка при компилация.

Абстрактен клас

Класът, който съдържа поне една чиста функция, се нарича „абстрактен клас“. Не могат да се създават обекти на абстрактни класове, но можете да създавате препратки и указатели към абстрактни класове. Членовете на абстрактните класове могат да бъдат достъпни чрез обекта на производни класове, който наследява абстрактния основен клас.

Клас, който искате да декларирате абстрактно, използвайте ключовата дума "Абстрактно" пред "Клас" ключова дума.

// например абстрактно име на клас клас {. , виртуален тип funct_name (параметър_ списък) = 0; , , };

  1. Виртуалните функции определено са дефинирани в базовия клас и са предефинирани (преопределени) в производния клас. От друга страна, чистата виртуална функция базовият клас не е особено дефинирана в базовия клас
  2. Получен клас, ако се изисква предефиниране (отмяна) на виртуалната функция, докато в случай на чиста виртуална функция полученият клас трябва определено да дефинира чисто виртуалната функция.
  3. Ако полученият клас не успее да дефинира (надмени) виртуалната функция, той може да използва виртуалната функция на базовия клас. И обратно, ако производен клас не успее да отмени чистата виртуална функция, тогава възниква грешка при компилация.
  4. Базовият клас, съдържащ виртуалната функция, може да бъде инстанциран, т.е. неговият обект може да бъде създаден. За разлика от базовия клас, съдържащ чиста виртуална функция, т.е. абстрактен клас не може да бъде създаден, тъй като абстрактният клас не е дефиниран напълно.

Забележка:
Прототипът на „виртуална функция“ и „чиста виртуална функция“ остава един и същ в цялата програма.

Заключение:

И двете „виртуални функции“ и „чиста виртуална функция“ имат своето значение, както при „виртуалните функции“, всички производни класове не се нуждаят от предефиниране на виртуалната функция и когато искаме, всички производни класове трябва да предефинират виртуалната функция, чиста виртуална функция най-добре се прилага там.