Виртуелни деструктор у Ц++

Virtuelni Destruktor U C



Ц++ је језик који се користи за давање основе у основном концепту програмирања и чини логичко размишљање програмера снажним. У Ц++, ООП игра виталну улогу пошто је ООП објектно оријентисани језик који креира објекте класа. У ООП-у проучавамо класе и објекте. Класе садрже чланове података који су променљиве различитих типова и различитих функција чланова. Уз помоћ инстанци приступамо подацима било које класе. Свака класа има свој конструктор и деструктор када креирате класу. Конструктор се сам позива када се креира објекат те класе. Такође можемо иницијализовати променљиве класе унутар конструктора. Деструктори се такође аутоматски креирају са конструктором, али деструктори уништавају објекат и то је последња функција која се позива пре уништавања објекта. Креира се назив класе, на пример класа „Професија“. Његов конструктор је Профессион(), а деструктор је ~Профессион (). Њих тројица имају исто име.

После разговора о ООП-у, конструкторима и деструкторима, хајде да сада причамо о виртуелним деструкторима. Виртуелни деструктори, како је наведено у називу, уништавају објекат. Имамо основну класу и изведену класу која је изведена из основне класе. Обе класе имају своје конструкторе и деструкторе. Виртуелни деструктор ослобађа реминисценцију која се додељује преко објекта изведене класе док брише објекте изведене класе користећи показивач основне класе са кључном речи „виртуелно“.

Зашто користимо виртуелни деструктор?

Када се извршавање функција члана класе заврши или се извршавање маин() методе ускоро завршава, деструктор се аутоматски позива да ослободи меморију која је додељена током креирања објекта. Сада, зашто користимо виртуелни деструктор? Када се обрише основна класа која указује на изведену класу, овде се користи показивач (*). Деструктор основне класе се позива само током овог процеса. Деструктор изведене класе се не позива што доводи до проблема. Један од њих је проблем са цурењем меморије. Да бисмо избегли овај проблем и учинили наш код безбедним, ми виртуелно уништавамо објекте да бисмо ослободили меморијски простор који је додељен током креирања објеката брисањем деструктора основне класе.

Основни пример Ц++ без виртуелног деструктора

Хајде да видимо како програм функционише без виртуелног деструктора са једноставним програмом који брише показивач.

код:

#инцлуде <иостреам>

користећи простор имена стд ;
класа Родитељ_Класа0
{
јавности :
Парент_Цласс0 ( )
{ цоут << „Конструктор родитељске класе“ << ендл ; }
~Парент_Цласс0 ( )
{ цоут << „Деструктор родитељске класе“ << ендл ; }
} ;
разред Дете_1 : публиц Парент_Цласс0
{
јавности :
Цхилд_1 ( )
{ цоут << „Конструктор за децу“ << ендл ; }
~Цхилд_1 ( )
{ цоут << „Деструктор класе деце“ << ендл ; }
} ;
инт главни ( )
{
Парент_Цласс0 * показивач = ново дете_1 ( ) ;
брисање показивача ;
повратак 0 ;
}

Овај код објашњава како се код извршава без виртуелног деструктора. Пре свега, креирајте класу под називом „Парент_Цласс0“ која ће бити родитељска класа. Унутар ове класе направите конструктор и деструктор. Као што знамо, конструктор и деструктор се зову исто као и класа. Деструктор је представљен слично као и конструктор, али има симбол (~) који га разликује од конструктора. Унутар конструктора и деструктора, одштампајте поруку користећи „цоут<<“. Сада креирајте другу класу која је „Цхилд_1“. Ова класа је изведена из родитељске класе, „Парент_Цласс0“. Изведена класа има свој конструктор и деструктор који садрже поруку за штампање на излазном екрану.

У методи маин() креирамо инстанцу „Парент_Цласс0“ и додељујемо јој изведену класу. Кључна ствар коју треба запамтити у овом случају је да користимо показивач за преузимање родитељске класе. Када уђе унутар родитељске класе, извршава конструктор родитељске класе. Затим иде у подређену класу и извршава њен конструктор. Пре извршавања деструктора подређене класе, он мора да изврши деструктор надређене класе. Преводилац извршава деструктор родитељске класе и прекида класу без извршавања деструктора подређене класе. То је проблем; не ослобађа сећање на час детета. Представља конструктор родитељске класе, конструктор подређене класе и деструктор родитељске класе. То показује да се деструктор подређене класе не извршава. Након овог извршења, бришемо показивач у функцији маин().

Излаз:

Пример Ц++ са виртуелним деструктором

Хајде да разговарамо о виртуелном деструктору са једноставним кодом да бисмо разликовали како он функционише са и без виртуелног деструктора.

код:

#инцлуде <иостреам>

користећи простор имена стд ;
класа Родитељ_Класа0
{
јавности :
Парент_Цласс0 ( )
{ цоут << „Конструктор родитељске класе“ << ендл ; }
виртуал ~Парент_Цласс0 ( )
{ цоут << „Деструктор родитељске класе“ << ендл ; }
} ;
разред Дете_1 : публиц Парент_Цласс0
{
јавности :
Цхилд_1 ( )
{ цоут << „Конструктор за децу“ << ендл ; }
виртуелни ~Цхилд_1 ( )
{ цоут << „Деструктор класе деце“ << ендл ; }
} ;
инт главни ( )
{
Парент_Цласс0 * показивач = ново дете_1 ( ) ;
брисање показивача ;
повратак 0 ;
}

Први програм је објаснио проблем са којим се суочавамо без виртуелног деструктора. Сада ће овај код решити тај проблем користећи виртуелни деструктор. Прво копирајте први код и само додајте једну кључну реч на два места у овом програму. Та реч је „виртуелна“. Уметните ову реч са деструктором родитељске класе, „Парент_Цласс0“. Слично, спомените ово са деструктором подређене класе који је „Цхилд_1“ који је изведен из надређене класе. Ова „виртуелна“ кључна реч прави малу промену и прво извршава деструктор деструкторске класе „Цхилд_1“. Затим извршава деструктор родитељске класе, „Парент_Цласс0“. Остатак програма ради исто као и без виртуелног деструктора. Додавањем овог малог дела кода можемо сачувати нашу меморију од цурења. Сада приказује четири поруке на конзоли. Прво, конструктор надређене класе, затим конструктор подређене класе, деструктор подређене класе и деструктор надређене класе. На крају обришемо показивач унутар методе маин().

Излаз:

Ц++ пример чистог виртуелног деструктора

У овом коду ћемо говорити о чистом виртуелном деструктору, како он функционише и како се разликује од виртуелног деструктора.

код:

#инцлуде <иостреам>

класа Родитељ_0 {
јавности :
виртуелни ~Парент_0 ( ) = 0 ;
} ;
Родитељ_0 :: ~Парент_0 ( )
{
стд :: цоут << 'Здраво, ја сам Пуре Деструцтор. Ви сте ме звали!' ;
}
класа Дете_0 : јавни Родитељ_0 {
јавности :
~Цхилд_0 ( ) { стд :: цоут << „Изведени деструктор је овде ' ; }
} ;

инт главни ( )
{
Родитељ_0 * птр_0 = ново дете_0 ( ) ;
обриши птр_0 ;
повратак 0 ;
}

Родитељска класа “Парент_0” је креирана у првом кораку кода. Унутар њега креирајте виртуелни родитељски деструктор и доделите му 0. Ово поставља виртуелни деструктор на чисти виртуелни деструктор што значи да је родитељска класа сада апстрактна и не можемо да креирамо инстанце ове класе. Изван родитељске класе „Парент_0“, дефинишите деструкторе и стд::цоут. Тражени текст се приказује коришћењем стд::цоут. Затим изведите класу „Цхилд_0“ из родитељске класе и дефинишите њен деструктор. Унутар деструктора одштампајте поруку. У функцији маин() креирајте показивач надређене класе и доделите јој подређену класу.

Компајлер иде у родитељску класу „Парент_0“. Када се показивач креира, аутоматски се позива његов конструктор. Затим, компајлер иде у класу деце да би позвао њен конструктор. Након успешног извршења конструктора, он извршава деструктор подређене класе „Цхилд_0“. Затим извршава деструктор родитељске класе. На овај начин можемо направити чисти виртуелни деструктор. Не подстиче се да се користи јер коришћењем ове методе, родитељска класа постаје апстрактна што је чини бескорисном. Методологија која се најчешће користи је виртуелни деструктор и то је добра пракса.

Излаз:

Закључак

Учили смо о виртуелном деструктору почевши од концепта ООП-а до померања ка конструкторима и деструкторима. Након што смо све ово објаснили, детаљно смо разговарали о виртуелном деструктору са примерима кодирања и чистом виртуелном деструктору. Пре него што објаснимо виртуелни деструктор, морамо знати о конструкторима, деструкторима и наслеђивању. У наслеђивању, наслеђујемо класе од родитељске класе. Подређене класе могу бити више од једне, али родитељска класа је само једна. Виртуелни деструктори и чисти виртуелни деструктори се примењују у наслеђивању да би се спасили од цурења меморије. Од основног примера до напредног примера, покрили смо све што треба да знате да бисте почели да користите и виртуелно уништили меморију изведене класе.