சி++ விர்ச்சுவல் கன்ஸ்ட்ரக்டர்

Ci Virccuval Kanstraktar



C++ ஆனது மெய்நிகர் கன்ஸ்ட்ரக்டர்களை உருவாக்க எங்களுக்கு உதவாது, ஏனெனில் வகுப்பின் கன்ஸ்ட்ரக்டரை மேலெழுத முடியாது. எனவே, கன்ஸ்ட்ரக்டர் மெய்நிகராக்கம் என்பது அர்த்தமற்றது. C++ நிரலில் மெய்நிகர் கட்டமைப்பாளரை உருவாக்கும் கருத்து இல்லை, ஆனால் நாம் அங்கு மெய்நிகர் அழிப்பான் உருவாக்கலாம். ஒரு கன்ஸ்ட்ரக்டரை C++ இல் நிரலாக்கம் செய்வதை மெய்நிகர் என்று கருத முடியாது என்பதால் அதை நாம் வரையறுக்கலாம், ஏனெனில் ஒரு வகுப்பின் கன்ஸ்ட்ரக்டர் அழைக்கப்படும்போது, ​​நினைவகத்தில் மெய்நிகர் அட்டவணை எதுவும் இல்லை, இது மெய்நிகர் சுட்டிக்காட்டி உருவாக்கப்படவில்லை என்பதைக் குறிக்கிறது. எனவே, கட்டமைப்பாளர் எல்லா நேரங்களிலும் மெய்நிகர் அல்லாதவராக இருக்க வேண்டும்.

இருப்பினும், ஒரு மெய்நிகர் அழிப்பான் இருக்கலாம். இங்கே, நாம் C++ இல் ஒரு மெய்நிகர் கன்ஸ்ட்ரக்டரை உருவாக்கும்போது என்ன நடக்கிறது என்பதையும், மெய்நிகர் கன்ஸ்ட்ரக்டருக்குப் பதிலாக விர்ச்சுவல் டிஸ்ட்ரக்டரின் செயல்பாடுகளையும் காண்பிப்போம்.

எடுத்துக்காட்டு 1:

மெய்நிகர் கட்டமைப்பாளரை உருவாக்கி, 'iostream' தலைப்புக் கோப்பை வைப்பதன் மூலம் எங்கள் குறியீட்டைத் தொடங்குவோம். இந்த தலைப்பு கோப்பு அதில் அறிவிக்கப்பட்ட 'சின்' மற்றும் 'கவுட்' போன்ற செயல்பாடுகளுக்கானது. இதற்குப் பிறகு, 'std' பெயர்வெளியைச் சேர்க்கிறோம், எனவே இந்த 'std' ஐ எங்கள் குறியீட்டில் உள்ள ஒவ்வொரு செயல்பாட்டிலும் சேர்க்க முடியாது. இதற்குப் பிறகு, எங்கள் குறியீட்டின் அடிப்படை வகுப்பான 'my_base' என்ற பெயரில் ஒரு வகுப்பை உருவாக்கி, மெய்நிகர் கட்டமைப்பாளரை உருவாக்க 'பொது' என்பதைச் சேர்ப்போம்.







மெய்நிகர் கட்டமைப்பாளர் இங்கு 'மெய்நிகர்' முக்கிய சொல்லை வைப்பதன் மூலம் உருவாக்கப்படுகிறது. இந்த மெய்நிகர் கட்டமைப்பாளரின் உள்ளே, நாங்கள் ஒரு 'கவுட்' அறிக்கையை வைக்கிறோம். இதற்குக் கீழே, 'ஷோ' என்ற செயல்பாட்டை உருவாக்குகிறோம், அதில் 'கவுட்' ஐ மீண்டும் பயன்படுத்துகிறோம். இதற்குப் பிறகு, 'my_derived' என்ற பெயருடன் இந்த அடிப்படை வகுப்பின் பெறப்பட்ட வகுப்பை உருவாக்கி, 'பொது' புலத்தில் 'my_derived()' கட்டமைப்பாளரை நிறுவுவோம். இந்த 'my_derived()' கன்ஸ்ட்ரக்டரில் 'cout' அறிக்கையைச் செருகுவோம். அதன் கீழே, 'ஷோ' என்ற செயல்பாட்டை நாங்கள் உருவாக்குகிறோம், அங்கு 'கவுட்' ஐ மீண்டும் பயன்படுத்துகிறோம்.



இப்போது, ​​“main()” ஐத் தூண்டிய பிறகு, “my_ptr” என்ற பெயருடன் அடிப்படை வகுப்பின் சுட்டியை உருவாக்குகிறோம், மேலும் “Obj_d” என்ற பெறப்பட்ட வகுப்பின் பொருளையும் உருவாக்குகிறோம். இதற்குப் பிறகு, 'Obj_d' இன் முகவரியை 'my_ptr' க்கு ஒதுக்குகிறோம். பின்னர், 'show()' செயல்பாட்டை 'my_ptr' மூலம் அழைக்கிறோம்.



குறியீடு 1:





# அடங்கும்
பயன்படுத்தி பெயர்வெளி வகுப்பு ;
வர்க்கம் என்_அடிப்படை
{
பொது :
மெய்நிகர் என்_அடிப்படை ( )
{
கூட் << 'இதோ எனது அடிப்படை வகுப்பு' << endl ;
}
வெற்றிடமானது நிகழ்ச்சி ( )
{
கூட் << 'அடிப்படை வகுப்பின் நிகழ்ச்சி செயல்பாடு' << endl ;
}
} ;
வர்க்கம் என்_பெறப்பட்டது : பொது என்_அடிப்படை
{
பொது :
என்_பெறப்பட்டது ( )
{
கூட் << 'இதோ என் பெறப்பட்ட வகுப்பு' << endl ;
}
வெற்றிடமானது நிகழ்ச்சி ( )
{
கூட் << 'பெறப்பட்ட வகுப்பின் நிகழ்ச்சி செயல்பாடு' < நிகழ்ச்சி ( ) ;
}

வெளியீடு:
இங்கே, C++ நிரலாக்கத்தில் கன்ஸ்ட்ரக்டரை மெய்நிகர் என்று அறிவிக்க முடியாது என்று ஒரு பிழைச் செய்தியைக் காட்டுகிறது. எனவே, C++ ஆனது மெய்நிகர் கட்டமைப்பாளரை உருவாக்க அனுமதிக்காது, ஆனால் நாம் மெய்நிகர் அழிப்பாளரை உருவாக்கலாம்.



எடுத்துக்காட்டு 2:

முந்தைய சிக்கலைத் தீர்த்து, இந்தக் குறியீட்டில் மெய்நிகர் அழிப்பான் உருவாக்குவோம். 'new_base' வகுப்பை அறிவித்த பிறகு, 'public' கன்ஸ்ட்ரக்டரை வைக்கிறோம், அதில் 'new_base' உடன் 'virtual ~' ஐ சேர்ப்பதன் மூலம் மெய்நிகர் அழிப்பான் உருவாக்கப்படும். இந்த விர்ச்சுவல் டிஸ்ட்ரக்டரில் “கவுட்” அறிக்கையைச் செருகுவோம். அதன் கீழே, 'கவுட்' ஐப் பயன்படுத்தும் 'ஷோ' என்ற செயல்பாட்டை உருவாக்குகிறோம். அடுத்து, இந்த 'புதிய_பேஸ்' அடிப்படை வகுப்பின் 'புதிய_பெறப்பட்ட' வகுப்பை உருவாக்கி, 'பொது' புலத்தில் 'புதிய_பெறப்பட்ட()'டிஸ்ட்ரக்டரை உருவாக்குவோம். இந்த “new_derived()” destructor இப்போது அதில் “cout” அறிக்கை சேர்க்கப்பட்டுள்ளது.

அதன் கீழே, 'கவுட்' அறிக்கையை மீண்டும் பயன்படுத்தும் 'ஷோ' என்ற செயல்பாட்டை உருவாக்குகிறோம். “main()” செயல்பாட்டை அழைத்த பிறகு, இப்போது “obj_d” பெறப்பட்ட வகுப்பின் ஒரு பொருளையும் அத்துடன் “ptr1” என்ற அடிப்படை வகுப்பின் சுட்டியையும் உருவாக்குகிறோம். அதைத் தொடர்ந்து, 'ptr1' க்கு 'obj_d' முகவரியைக் கொடுக்கிறோம். அடுத்து, 'show()' முறை 'ptr1' ஐப் பயன்படுத்தி செயல்படுத்தப்படுகிறது.

குறியீடு 2:

# அடங்கும்
பயன்படுத்தி பெயர்வெளி வகுப்பு ;
வர்க்கம் புதிய_அடிப்படை
{
பொது :
மெய்நிகர் ~புதிய_தளம் ( )
{
கூட் << 'பேஸ் கிளாஸ் டிஸ்ட்ரக்டர் இங்கே உள்ளது' << endl ;
}
வெற்றிடமானது நிகழ்ச்சி ( )
{
கூட் << 'அடிப்படை வகுப்பின் நிகழ்ச்சி செயல்பாடு' << endl ;
}
} ;
வர்க்கம் புதிய_பெறப்பட்டது : பொது புதிய_அடிப்படை
{
பொது :
~புதிய_பெறப்பட்டது ( )
{
கூட் << 'பெறப்பட்ட வகுப்பு அழிப்பான் இங்கே உள்ளது' << endl ;
}
வெற்றிடமானது நிகழ்ச்சி ( )
{
கூட் << 'அடிப்படை வகுப்பின் நிகழ்ச்சி செயல்பாடு' < நிகழ்ச்சி ( ) ;
}

வெளியீடு:
இந்த நிரல் 'new_base' இன் சுட்டிக்காட்டி பொருளைப் பயன்படுத்துகிறது, இது 'obj_d' பெறப்பட்ட வகுப்பைக் குறிக்கிறது. எனவே, இது 'நியூ_பேஸ்' வகுப்பின் 'ஷோ()' முறையை முதலில் அழைக்கிறது. பின்னர், அது 'புதிய_பெறப்பட்ட' வகுப்பின் '~new_derived()' முறையை அழைக்கிறது மற்றும் அடிப்படை வகுப்பின் '~new_base'ஐக் காட்டுகிறது.

எடுத்துக்காட்டு 3:

'மெய்நிகர்' கட்டமைப்பாளரை உருவாக்க மற்றொரு குறியீடு இங்கே உள்ளது. 'iostream' மற்றும் 'std' பெயர்வெளியை சேர்த்த பிறகு, 'B' வகுப்பை உருவாக்குகிறோம். இதற்குக் கீழே, 'B()' என்ற 'பொது' கட்டமைப்பாளரை உருவாக்கி, பின்னர் 'cout' ஐ உருவாக்குகிறோம். வகுப்பில் உள்ள எந்தவொரு பொருளும் அழைக்கக்கூடிய 'பொது' அணுகல் விவரக்குறிப்பைப் பயன்படுத்துவதன் மூலம் கட்டமைப்பாளர் மற்றும் அழிப்பான் செயல்பாடுகள் வரையறுக்கப்படுகின்றன.

இப்போது, ​​இந்த அடிப்படை வகுப்பின் “~B()” டிஸ்ட்ரக்டரையும் உருவாக்குகிறோம், அதில் மீண்டும் “cout” ஐப் பயன்படுத்துகிறோம். பின்னர், 'B' அடிப்படை வகுப்பின் பெறப்பட்ட வகுப்பான 'D' வகுப்பை உருவாக்கி, 'பொது' என்பதை இங்கே வைக்கிறோம். இந்த “பொது” க்குள், நாங்கள் முறையே “D()” மற்றும் “~D” என்ற பெயர்களைக் கொண்டு பெறப்பட்ட வகுப்பின் கட்டமைப்பாளரையும் அழிப்பாளரையும் உருவாக்குகிறோம். இரண்டும் தங்களுக்குள் இருக்கும் 'கவுட்'. இப்போது, ​​​​எங்களிடம் 'முக்கிய()' செயல்பாடு உள்ளது. இந்த செயல்பாட்டை அழைத்த பிறகு, அடிப்படை வகுப்பின் சுட்டிக்காட்டி பொருளை உருவாக்குகிறோம்.

பின்னர், 'நீக்கு' முக்கிய சொல்லைப் பயன்படுத்துகிறோம் மற்றும் 'base_ptr' ஐ இங்கே வைக்கிறோம். இந்த வழக்கில், அடிப்படை வகுப்பின் சுட்டிக்காட்டி பொருளை அழைப்பதன் மூலம் அழிப்பாளரின் இடம் நீக்கப்படும்.

குறியீடு 3:

# அடங்கும்
பயன்படுத்தி பெயர்வெளி வகுப்பு ;
வர்க்கம் பி
{
பொது :
பி ( )
{
கூட் << 'அடிப்படை வகுப்பின் கட்டமைப்பாளர்' << endl ;
}
~பி ( )
{
கூட் << 'அடிப்படை வகுப்பை அழிப்பவர்' << endl ;
}
} ;

வர்க்கம் டி : பொது பி
{
பொது :
டி ( )
{
கூட் << 'பெறப்பட்ட வகுப்பின் கட்டமைப்பாளர்' << endl ;
}
~D ( )
{
கூட் << 'பெறப்பட்ட வகுப்பை அழிப்பவர்' << endl ;
}
} ;
முழு எண்ணாக முக்கிய ( )
{
பி * அடிப்படை_ptr = புதிய டி ;
அழி அடிப்படை_ptr ;
}

வெளியீடு:
முக்கிய செயல்பாட்டில் 'B' வகுப்பை சுட்டிக்காட்டும் ஒரு சுட்டிக்காட்டி பொருளைப் பயன்படுத்துகிறது என்பதை முடிவு காட்டுகிறது. எனவே, இது 'B' வகுப்பின் 'கட்டமைப்பாளர்()' ஐ முதலில் அழைக்கிறது. பின்னர், அது 'டி' வகுப்பின் 'கட்டமைப்பாளர்()' என்று அழைக்கிறது. 'B' மற்றும் 'D' வகுப்புகளை அழிப்பவர்கள் வைத்திருக்கும் சுட்டிக்காட்டி பொருள் பின்னர் நீக்கப்படும். நிரலுக்குள் 'D' வகுப்பின் அழிப்பாளரைத் தூண்டாமல், 'B' வகுப்பைச் சுட்டிக்காட்டி 'B' வகுப்பின் அழிப்பவரை மட்டுமே நீக்குகிறது. இதன் விளைவாக, நிரலின் நினைவகம் சிதைந்துள்ளது.

முடிவுரை

C++ நிரலாக்கத்தில் 'மெய்நிகர் கட்டுமானம்' என்ற கருத்தை நாங்கள் விவாதித்தோம். C++ இல் விர்ச்சுவல் கன்ஸ்ட்ரக்டரை உருவாக்க முடியாது என்பதை நாங்கள் ஆராய்ந்தோம், ஆனால் எங்கள் குறியீடுகளில் விர்ச்சுவல் டிஸ்ட்ரக்டரை உருவாக்கலாம். C++ நிரலாக்கத்தில் மெய்நிகர் கன்ஸ்ட்ரக்டரை உருவாக்கும்போது என்ன நடந்தது என்பதையும், எங்கள் குறியீடுகளில் விர்ச்சுவல் டிஸ்ட்ரக்டரின் செயல்பாடுகளையும் இங்கே காண்பித்தோம். கன்ஸ்ட்ரக்டர் விர்ச்சுவல் ஆக இருக்க முடியாது என்பதை அறிந்தோம், ஆனால் எங்கள் வகுப்பில் விர்ச்சுவல் டிஸ்ட்ரக்டரை உருவாக்க முடியும். இந்த வழிகாட்டியில் சில எடுத்துக்காட்டுகளை நாங்கள் விளக்கி, இந்த குறியீடுகளை முழுமையாக விளக்கியுள்ளோம்.