Сравнителна таблица
Основа за сравнение | наследяване | полиморфизъм |
---|---|---|
Основен | Наследяването създава нов клас, използвайки свойствата на вече съществуващия клас. | Полиморфизмът е в общи линии общ интерфейс за множество форми. |
изпълнение | Наследяването основно се прилага на класове. | Полиморфизмът се прилага основно по функция / методи. |
употреба | Да подкрепи концепцията за повторна употреба в ООП и намалява дължината на кода. | Позволява на обекта да реши коя форма на функцията да бъде извикана, когато се компилира (претоварване), както и време за изпълнение (презареждане). |
Форми | Наследяването може да бъде единично наследяване, множествено наследяване, многостепенно наследяване, йерархично наследяване и хибридно наследяване. | Полиморфизмът може да бъде полиморфизъм по време на компилация (претоварване) или полиморфизъм по време на изпълнение (преодоляване). |
пример | Класът „таблица“ може да наследи характеристиката на класа „мебели“, тъй като „масата“ е „мебели“. | Класът 'study_table' може също да има функция 'set_color ()', а клас 'Dining_table' също може да има функция 'set_color ()', така че коя форма на функцията set_color () да се извиква, може да бъде решена и на двете, компилиране и време на изпълнение. |
Определение за наследяване:
Наследяването е една от ключовите характеристики на ООП, която силно подкрепя „повторната употреба“. Възможността за повторна употреба може да бъде описана като създаване на нов клас чрез повторно използване на свойствата на съществуващия клас. В наследяването има базов клас, който се наследява от извлечения клас. Когато един клас наследява всеки друг клас, членът или членовете на базовия клас стават член (и) на производен клас.
Общата форма на наследяване на клас е следната:
class выведен-клас-име: access-спецификатор base-class-name {// тялото на класа};
Тук спецификаторът за достъп осигурява режима на достъп (частен, публичен, защитен) към член (ове) в базовия клас на извлечения клас. Ако няма спецификатор за достъп, по подразбиране той се счита за "частен". В C ++, ако извлеченият клас е “struct”, тогава спецификаторът за достъп е “публичен” по подразбиране.
В C ++ наследяването може да се постигне в пет форми. Те могат да бъдат класифицирани като: -
- Единично наследяване (само един супер клас)
- Многократно наследяване (няколко суперкласа)
- Йерархично наследяване (един суперклас, много подкласове)
- Многократно наследяване (получено от производен клас)
В Java, класът наследява другия клас, като използва ключовата дума „extends“. В Java базовият клас се нарича супер клас, а извлеченият клас се споменава като подклас. Подкласът не може да има достъп до тези членове на базовия клас, които са обявени за „частни“. Общата форма, която наследява класа в Java, е следната.
class выведен-клас-име разширява base-class-name {// тялото на класа};
Java не поддържа наследството на множествено наследяване, докато поддържа многостепенна йерархия. В Java понякога суперкласът може да иска да скрие детайлите по внедряването и прави част от тези данни „лична“. Както в Java, подкласът не може да има достъп до частните членове на суперкласа и ако подкласът иска да получи достъп или да инициализира тези членове, Java осигурява решение. Подкласът може да насочи членовете на своя непосредствен суперклас с помощта на ключова дума „супер”. Не забравяйте, че имате достъп само до членовете на непосредствения суперклас.
"Супер" има две общи форми. Първият е, той използва, за да извика конструктора на супер клас. Вторият е достъпът до члена на суперкласа, който е бил скрит от члена на подкласа.
// първата форма на извикване на конструктора. клас supper_class {supper_class (argument_list) {..} // конструктор на супер клас}; class sub_class разширява supper_class {sub_class (argument_list) {..} // конструктор на sub_class super (argument_list); // sub_class извиква конструктора на супер класа}};
// второ за 'super' клас supper_class {int i; } class sub_class разширява supper_class {int i; sub_class (int a, int b) {super.i = a; // "i" на супер клас i = b; // 'i' от подклас}};
Определение на полиморфизма
Терминът полиморфизъм просто означава „една функция, множество форми“. Полиморфизъм се постига както при компилиране, така и по време на работа. Полиморфизмът на компилираното време се постига чрез "претоварване", докато полиморфизмът по време на изпълнение се постига чрез "преодоляване".
Полиморфизмът позволява на обекта да реши „коя форма на функцията да бъде извиквана, когато“ в двете времена на компилиране и време на изпълнение.
Да обсъдим първата концепция за претоварване. При претоварване дефинираме функция в клас повече от един път с различен тип данни и броя на параметрите, докато функцията, която трябва да бъде претоварена, трябва да има същия тип връщане. Повечето от времето, когато функциите на претоварените са конструктори на класа.
претоварване на клас {int a, b; public: int претоварване (int x) {// първи претоварване () конструктор a = x; връщане a; } int претоварване (int x, int y) {// втори конструктор на претоварване () a = x; б = Y; връщане a * b; }}; int main () {претоварване O1; O1.overload (20); // първото извикване на конструкция на overload () O1.overload (20, 40); // второ извикване на конструктор на претоварване ()
Сега, нека да обсъдим втората форма на полиморфизма, т.е. Концепцията за преодоляване може да бъде приложена само към функцията на класовете, които също прилагат концепцията за наследяване. В C ++, функцията, която трябва да бъде отменена, се предшества от ключовата дума "виртуална" в базовия клас и се предефинира в производния клас със същия прототип, с изключение на ключовата дума "виртуална".
class base {public: virtual void funct () {// виртуална функция на базисния клас cout << "Това е функцията на базовия клас ()"; }}; клас deriv1: public base {public: void funct () {// виртуална функция на базовия клас, предефинирана в клас 1Основни разлики между наследяване и полиморфизъм
- Наследяването създава клас, който извлича своята характеристика от вече съществуващ клас. От друга страна, полиморфизмът е интерфейс, който може да бъде дефиниран в множество форми.
- Наследяването е реализирано върху класовете, докато полиморфизмът се прилага на методи / функции.
- Тъй като наследяването позволява на извлечения клас да използва елементите и методите, дефинирани в базовия клас, извлеченият клас не трябва да дефинира тези елементи или метод отново, така че можем да кажем, че увеличава възможността за повторно използване на кода и следователно намалява дължината на кода, От друга страна, полиморфизмът дава възможност на един обект да реши каква форма на метода иска да извика както по време на компилирането, така и по време на изпълнение.
- Наследяването може да се класифицира като единично наследяване, множествено наследяване, многостепенно наследяване, йерархично наследяване и хибридно наследяване. От друга страна, полиморфизмът се класифицира като претоварване и преодоляване.
Заключение:
Наследяването и полиморфизмът са взаимосвързани понятия, тъй като динамичният полиморфизъм се отнася за класовете, които също прилагат концепцията за наследяване.