inheritance c
Значај наслеђивања у Ц ++ са примерима:
Наслеђивање је једна од најважнијих карактеристика објектно оријентисаног програмирања.
Наслеђивање је техника којом једна класа стиче својства и методе друге класе. На овај начин можемо поново користити код који је већ написан и верификован. Класа која стиче својства друге класе назива се подкласа или изведена класа или подређена класа.
Класа чија су својства стечена назива се основна класа или родитељска класа или суперкласа. Када једна класа стекне или наследи другу класу, тада су сва својства и методе основне класе доступне за изведену класу, тако да можемо поново користити овај код.
=> Посетите овде да бисте научили Ц ++ из огреботина.
шта је безбедносни кључ за рутер
Шта ћете научити:
- Зашто нам је потребно наследство?
- Начини наслеђивања
- Поредак конструктора / деструктора у наслеђивању
- Врсте наслеђивања
- Наслеђивање шаблона
- Састав
- Како да одлучимо између састава и наслеђа?
- Закључак
- Препоручено читање
Зашто нам је потребно наследство?
Узмите у обзир групу возила попут аутомобила, аутобуса, џипа итд. Свако од ових возила има својства и методе како је наведено на доњем дијаграму.
Ако се од нас захтева да применимо појединачне класе за горе наведена возила, можемо видети да ћемо у све три класе морати да напишемо исти код као што све три врсте возила мање или више показују иста својства. То ће наш програм учинити неефикасним и гломазним, јер ће бити пуно дупликата кода.
Уместо да напишемо дуплирани код као горе, можемо применити особину наслеђивања како бисмо спречили дуплицирање кода, а такође написали један комад кода и користили га у све три класе. Ово је сликовито представљено као у наставку.
На горњој слици дефинисали смо основну класу „Возила“ и из ове класе извели класе Цар, Бус и Јееп. Уобичајене методе и својства сада су део класе Возила. Како су друге класе изведене из класе Возила, све класе стичу ове методе и својства.
Дакле, само треба да напишемо заједнички код само једном и све три класе; Набавит ће га аутомобил, аутобус и џип.
Стога је главна предност коју добијамо наслеђивањем постојећих класа или дизајнирањем механизма наслеђивања поновна употреба кода.
Даље читање = >> Водич за наслеђивање Јава
Општи формат за наслеђивање класе је:
class derived_classname: access_specifier base_classname { };
Овде “ изведено_име класе 'Је име изведене класе,' аццесс_специфиер 'Је начин приступа, тј. Јавни, заштићени или приватни у којем изведена класа мора да наследи основну класу и' изведено_име класе ”Је име основне класе из које изведена класа наслеђује.
Начини наслеђивања
„Приступни_спецификатор“ приказан у горњој изјави о наслеђивању може имати своје вредности као што је приказано у наставку.
У зависности од спецификације аццесс_специфиер која је наведена када наследимо класу, имамо различите начине наслеђивања као што је наведено у наставку.
Јавно наслеђивање
Општа синтакса
class sub_class : public parent_class
Када је наведен спецификатор јавног приступа, јавни чланови основне класе наслеђују се као јавни док су заштићени чланови заштићени. Приватни чланови остају приватни. Ово је најпопуларнији начин наслеђивања.
Приватно наслеђе
Општа синтакса
class sub_class : parent_class
Приватно наслеђе не наслеђује ништа. Када се користи спецификатор приватног приступа, јавни и заштићени чланови основне класе такође постају приватни.
Заштићено наслеђе
Општа синтакса
class sub_class:protected parent_class
Када се користи спецификатор заштићеног приступа, јавни и заштићени чланови основне класе постају заштићени чланови изведене класе.
Имајте на уму да када користимо спецификатор приватног приступа за основну класу, ниједан од чланова основне класе се не наслеђује. Сви они постају приватни у изведеној класи.
како је линук бољи од виндовс-а
У наставку је дат табеларни приказ свих начина приступа и њихова интерпретација за наслеђивање.
Изведена класа -> Основна класа | Приватни | Јавно | Заштићено |
---|---|---|---|
Приватни | Није наслеђено | Није наслеђено | Није наслеђено |
Јавно | Приватни | Јавно | Заштићено |
Заштићено | Приватни | Заштићено | Заштићено |
Поредак конструктора / деструктора у наслеђивању
Када се класе наслеђују, конструктори се позивају истим редоследом као и класе. Ако имамо основну класу и једну изведену класу која наслеђује ову основну класу, тада ће се прво позвати конструктор основне класе (било да је подразумевана или параметризирана), а затим изведени конструктор класе.
Следећи програм показује редослед конструктора у наслеђивању. Имамо основну класу „Басе“ која има подразумевани конструктор и параметризовани конструктор. Из овог изводимо класу која се назива „Изведено“ која такође има један задати и други параметризовани конструктор.
Излаз овог програма приказује редослед позивања конструктора.
#include using namespace std; //order of execution of constructors in inheritance class Base { int x; public: // default constructor Base() { cout Излаз:
Подразумевани конструктор основне класе
Подразумевани конструктор основне класе
Изведени подразумевани конструктор класе
Параметарски конструктор основне класе
Изведена параметарски конструктор класе
Видимо да након креирања објекта основне класе креирамо изведени објект класе са подразумеваним конструктором. Када се овај објект креира, прво се позива основни конструктор основне класе, а затим се извршава изведени конструктор класе.
Слично томе, када се изведени објекат класе креира помоћу параметризованог конструктора, прво се позива параметарски конструктор основне класе, а затим се позива изведени конструктор класе.
Имајте на уму да ако у основној класи није било параметарског конструктора, тада би задани конструктор био позван чак и за конструкцију параметризованог изведеног објекта класе.
Али остаје питање зашто се приликом конструкције изведених објеката класе позива конструктор основне класе?
Знамо да се конструктор користи за стварање објеката класе и за иницијализацију чланова класе. Када се креира изведени објекат класе, његов конструктор има контролу само над изведеним члановима класе.
Међутим, изведена класа такође наслеђује чланове основне класе. Да се позива само изведени конструктор класе, тада чланови основне класе које наслеђује изведена класа не би били правилно иницијализовани.
Као резултат, цео објекат неће бити креиран ефикасно. То је разлог због којег се сви конструктори основне класе прво позивају када се креира изведени објекат класе.
Врсте наслеђивања
У зависности од начина на који је класа изведена или колико основних класа класа наслеђује, имамо следеће типове наслеђивања као што је приказано на доњој слици.

Истражићемо сваки од ових типова у нашем следећем водичу о „Типовима наслеђивања“.
Наслеђивање шаблона
Када наша имплементација укључује предлошке, тада треба да наследимо или изведемо из класа шаблона и тамо користимо наслеђивање шаблона.
Кренимо директно на Пример програмирања да бисмо боље разумели наслеђивање помоћу шаблона.
#include using namespace std; //template inhertance templateclass basecls_Template { public: T value; basecls_Template(T value) { this->value = value; } void displayVal() { cout << value << endl; } }; //derived class inherits basecls_Template class derivedcls_Child : public basecls_Template { public: derivedcls_Child(/* no parameters */): basecls_Template( 0 ){ // default char is NULL; } derivedcls_Child(char c): basecls_Template( c ) { ; } void displayVal_drvd() { displayVal(); } }; int main() { basecls_Template obj( 100 ); derivedcls_Child obj1( 'A' ); cout<<'basecls_Template obj = '; obj.displayVal(); // should print '100' cout< Излаз:
басецлс_Темплате обј = 100
изведеноцлс_Цхилд обј1 (наслеђено из басецлс_Темплате = А
У горњем програму имамо шаблон под називом басецлс_Темплате који дефинише предложак класе за основну класу. Даље, дефинишемо класу изведенуцлс_Цхилд коју желимо да изведемо из класе предлошка.
Али имајте на уму да је класа басецлс_Темплате само тип, а не класа. Дакле, из овог предлошка не можемо извести класу деривацлс_Цхилд.
Стога, ако дечју класу прогласимо као:
class derivedcls_Child : public basecls_Template
Ово ће резултирати грешком. Разлог што је басецлс_Темплате је тип података, а не класа. Дакле, да бисмо наследили чланове басецлс_Темплате, прво бисмо га требали инстанцирати пре него што из њега изведемо.
Стога горња изјава, Изведена класацлс_Цхилд: публиц басецлс_Темплате ради добро.
У овој изјави направили смо пример шаблона басецлс_Темплате у предложак класе знакова. Једном када користимо ову инстанцирану класу предлошка, онда се остале ствари које следе, попут креирања и коришћења објеката, подударају са уобичајеним наслеђивањем.
Састав
До сада смо видели све о наследним односима. Наслеђивање у основи приказује врсту односа у којима однос указује на део. На пример, змија је врста гмизавца. Такође можемо рећи да је гмизавац део класе животиња.
Закључно, наследство указује 'ЈЕ' врста односа у којима можемо рећи да је изведена класа део основне класе.
Такође можемо представљати односе у целини. На пример, ако кажемо да је класа зарада део класе запослених, онда је не представљамо правилно. Знамо да запослени имају плату. Стога је погодније рећи „Запослени има плату“.
Слично томе, ако за пример узмемо класу Возила, можемо рећи да Возило има мотор или Возило има шасију. Тако приказују сви ови односи 'ИМА' односи који представљају цео објекат садржан у другој класи. Ово је дефинисано као Састав .
Односи приказани композицијом зависе једни од других. На пример, шасија не може постојати без Возила. Слично томе, плата не може постојати без запосленог.
Састав можемо представити схематски како је приказано доле:

Састав се такође назива и Задржавање. У горњој представи приказали смо родитељску класу. За разлику од наслеђивања, унутар родитељске класе укључујемо објект подређене класе. Ово је задржавање или састав.
ц ++ знак у инт
Узмимо пример програмирања да бисмо ово разумели.
#include using namespace std; //Composition example //Child class - address class Address { public: string houseNo, building, street, city, state; //Initialise the address object Address(string houseNo,string building,string street, string city, string state) { this->houseNo = houseNo; this->building = building; this->street = street; this->city = city; this->state = state; } }; //Parent class - Employee class Employee { private: Address* address; //composition->Employee has an address public: int empId; string empName; Employee(int empId, string empName, Address* address) { this->empId = empId; this->empName = empName; this->address = address; } void display() { cout< Излаз:
10001 Вед
А-101 Силвер Спрингс Аундх Пуне Махарасхтра
У овом примеру имамо родитељску класу Емплоиее и подређену адресу класе. Унутар надређене класе Емплоиее прогласили смо показивач на класу Аддресс и такође иницијализовали овај објекат у конструктору Емплоиее. Тако приказујемо однос запосленог са адресом која је његов састав.
Како да одлучимо између састава и наслеђа?
Композиција и наследство приказују односе између класа. Док наслеђе приказује однос „ИС-А“, композиција приказује однос „ХАС-А“.
Сада се поставља питање када треба користити наследство, а када композицију? Заправо, не можемо одлучити о тачним ситуацијама када бисмо требали користити било коју од њих. То је зато што свака има своје предности и недостатке.
Обе промовишу поновну употребу кода. Наслеђивање може чинити гломазан код како се решења сложе, али истовремено нам омогућава и проширивање постојећег кода. Према томе, требало би да користимо наслеђивање када је наш захтев да изменимо и користимо својства и метод друге класе унутар нове класе.
Другим речима, када желимо да додамо још својстава и проширимо постојећу класу. С друге стране, када не желимо да модификујемо својства и понашање друге класе, већ је једноставно користимо у класи, идемо на композицију.
Стога је најбоља одлука да ли ће се користити композиција или наследство донеће се одмеравањем предности и недостатака обе технике за одређену ситуацију.
= >> Прочитајте и Састав на Јави
Закључак
Тако смо дошли до краја наше теме о наслеђивању. Видели смо разне начине наследства. Такође смо видели врсте наслеђа, које ћемо истражити у следећем водичу. Сазнали смо за редослед конструктора који се извршавају у случају наследства.
Такође смо проучавали шаблоне и наследство. Морамо да направимо примерак шаблона пре него што га можемо користити у наслеђивању, јер је сам предложак тип података и не можемо наследити из типа података.
Састав је друга врста класних односа и прво морамо знати тачну ситуацију, а тек онда можемо одлучити да ли ћемо користити композицију или наследство.
У нашем предстојећем упутству видећемо више о врстама наследства.
=> Овде припазите на једноставне серије обуке за Ц ++.
Препоручено читање
- Врсте наслеђивања у Ц ++
- Рунтиме полиморфизам у Ц ++
- Функције пријатеља у Ц ++
- Коришћење класе Селениум Селецт за руковање падајућим елементима на веб страници - Водич за селениј бр. 13
- Класе и објекти на језику Ц ++
- Статички у Ц ++
- Водич за Уник цеви: Цеви у програмирању за Уник
- Јава интерфејс и лекција са апстрактним часовима са примерима