C++ ورچوئل کنسٹرکٹر

C Wrchwyl Kns Rk R



C++ ہمیں ورچوئل کنسٹرکٹرز کی تعمیر میں سہولت فراہم نہیں کرتا کیونکہ کلاس کے کنسٹرکٹر کو اوور رائڈ کرنا ممکن نہیں ہے۔ لہذا، کنسٹرکٹر ورچوئلائزیشن بے معنی ہے۔ C++ پروگرام میں ورچوئل کنسٹرکٹر بنانے کا کوئی تصور نہیں ہے، لیکن ہم وہاں ورچوئل ڈسٹرکٹر بنا سکتے ہیں۔ ہم اس کی وضاحت بھی کر سکتے ہیں کیونکہ C++ میں کنسٹرکٹر کی پروگرامنگ کو ورچوئل نہیں سمجھا جا سکتا کیونکہ جب کلاس کے کنسٹرکٹر کو کال کیا جاتا ہے تو میموری میں کوئی ورچوئل ٹیبل نہیں ہوتا ہے جس سے ظاہر ہوتا ہے کہ کوئی ورچوئل پوائنٹر نہیں بنایا گیا ہے۔ اس طرح، کنسٹرکٹر کو ہر وقت غیر مجازی ہونا چاہیے۔

تاہم، ایک ورچوئل ڈسٹرکٹر موجود ہو سکتا ہے۔ یہاں، ہم دکھائیں گے کہ جب ہم C++ میں ورچوئل کنسٹرکٹر بناتے ہیں تو کیا ہوتا ہے اور ساتھ ہی ورچوئل کنسٹرکٹر کے بجائے ورچوئل ڈسٹرکٹر کے کام۔

مثال 1:

آئیے ورچوئل کنسٹرکٹر بنائیں اور 'iostream' ہیڈر فائل رکھ کر اپنا کوڈ شروع کریں۔ یہ ہیڈر فائل ان فنکشنز کے لیے ہے جو اس میں ڈکلیئر کیے گئے ہیں جیسے 'cin' اور 'cout'۔ اس کے بعد، ہم 'std' نام کی جگہ شامل کرتے ہیں، لہذا ہم اپنے کوڈ میں ہر فنکشن کے ساتھ اس 'std' کو شامل نہیں کر سکتے۔ اس کے بعد، ہم ایک کلاس بناتے ہیں جو ہمارے کوڈ کی بنیادی کلاس ہے جس کا نام 'my_base' ہے اور پھر ورچوئل کنسٹرکٹر بنانے کے لیے 'public' شامل کریں۔







ورچوئل کنسٹرکٹر یہاں 'ورچوئل' کلیدی لفظ رکھ کر بنایا گیا ہے۔ اس ورچوئل کنسٹرکٹر کے اندر، ہم ایک 'cout' اسٹیٹمنٹ رکھتے ہیں۔ اس کے نیچے، ہم 'شو' کے نام سے ایک فنکشن بناتے ہیں جس میں ہم 'cout' کو دوبارہ استعمال کرتے ہیں۔ اس کے بعد، ہم اس بیس کلاس کی ایک اخذ شدہ کلاس بناتے ہیں جس کا نام 'my_derived' ہے اور پھر 'public' فیلڈ میں 'my_derived()' کنسٹرکٹر قائم کرتے ہیں۔ ہم اس 'my_derived()' کنسٹرکٹر میں 'cout' اسٹیٹمنٹ داخل کرتے ہیں۔ اس کے نیچے، ہم 'شو' کے نام سے ایک فنکشن بناتے ہیں جہاں ہم ایک بار پھر 'cout' کا استعمال کرتے ہیں۔



اب، 'main()' کو استعمال کرنے کے بعد، ہم 'my_ptr' کے نام سے بیس کلاس کا ایک پوائنٹر بناتے ہیں اور اخذ شدہ کلاس کا آبجیکٹ بھی بناتے ہیں جو کہ 'Obj_d' ہے۔ اس کے بعد، ہم 'Obj_d' کا پتہ 'my_ptr' کو تفویض کرتے ہیں۔ پھر، ہم 'my_ptr' کے ذریعے 'show()' فنکشن کو کال کرتے ہیں۔



کوڈ 1:





# شامل کریں
استعمال کرتے ہوئے نام کی جگہ std ;
کلاس میرا_بیس
{
عوام :
مجازی میرا_بیس ( )
{
cout << 'یہ میری بیس کلاس ہے' << endl ;
}
باطل دکھائیں ( )
{
cout << 'بیس کلاس کا شو فنکشن' << endl ;
}
} ;
کلاس my_dirived : عوام میرا_بیس
{
عوام :
my_dirived ( )
{
cout << 'یہ میری اخذ کردہ کلاس ہے' << endl ;
}
باطل دکھائیں ( )
{
cout << 'ماخوذ کلاس کا شو فنکشن' < دکھائیں ( ) ;
}

آؤٹ پٹ:
یہاں، یہ ایک ایرر میسج دکھاتا ہے جو کہتا ہے کہ کنسٹرکٹر کو C++ پروگرامنگ میں ورچوئل قرار نہیں دیا جا سکتا۔ لہذا، ہم دیکھ سکتے ہیں کہ C++ ہمیں ورچوئل کنسٹرکٹر بنانے کی اجازت نہیں دیتا لیکن ہم ورچوئل ڈسٹرکٹر بنا سکتے ہیں۔



مثال 2:

آئیے پچھلے مسئلے کو حل کریں اور اس کوڈ میں ورچوئل ڈسٹرکٹر بنائیں۔ 'نئے_بیس' کلاس کا اعلان کرنے کے بعد، ہم 'پبلک' کنسٹرکٹر رکھتے ہیں جس میں ہم 'نیو_بیس' کے ساتھ 'ورچوئل ~' شامل کرکے ورچوئل ڈسٹریکٹر بناتے ہیں۔ ہم اس ورچوئل ڈسٹرکٹر میں ایک 'cout' بیان داخل کرتے ہیں۔ اس کے نیچے، ہم 'شو' کے نام سے ایک فنکشن بناتے ہیں جو 'cout' کا استعمال کرتا ہے۔ اگلا، ہم ایک اخذ شدہ کلاس بناتے ہیں جو کہ اس 'new_base' بیس کلاس کی 'new_derived' ہے اور 'public' فیلڈ میں 'new_derived()'destructor کی تعمیر کرتے ہیں۔ اس 'new_derived()' ڈسٹرکٹر نے اب اس میں 'cout' بیان شامل کیا ہے۔

اس کے نیچے، ہم 'شو' کے نام سے ایک فنکشن بناتے ہیں جو 'cout' اسٹیٹمنٹ کو دوبارہ استعمال کرتا ہے۔ 'main()' فنکشن کو کال کرنے کے بعد، اب ہم 'obj_d' سے ماخوذ کلاس کے ساتھ ساتھ 'ptr1' نامی بیس کلاس کا ایک پوائنٹر تیار کرتے ہیں۔ اس کے بعد، ہم 'ptr1' کو 'obj_d' ایڈریس دیتے ہیں۔ اس کے بعد، 'show()' طریقہ 'ptr1' کا استعمال کرتے ہوئے استعمال کیا جاتا ہے۔

کوڈ 2:

# شامل کریں
استعمال کرتے ہوئے نام کی جگہ std ;
کلاس نیا_بیس
{
عوام :
مجازی ~نیا_بیس ( )
{
cout << 'بیس کلاس ڈسٹرکٹر یہاں ہے' << endl ;
}
باطل دکھائیں ( )
{
cout << 'بیس کلاس کا شو فنکشن' << endl ;
}
} ;
کلاس new_dirived : عوام نیا_بیس
{
عوام :
~نیا_ماخوذ ( )
{
cout << 'ماخوذ کلاس ڈسٹرکٹر یہاں ہے' << endl ;
}
باطل دکھائیں ( )
{
cout << 'بیس کلاس کا شو فنکشن' < دکھائیں ( ) ;
}

آؤٹ پٹ:
یہ پروگرام 'new_base' کا ایک پوائنٹر آبجیکٹ استعمال کرتا ہے جو 'obj_d' اخذ شدہ کلاس کی طرف اشارہ کرتا ہے۔ اس طرح، یہ پہلے 'نیو_بیس' کلاس کے 'شو()' طریقہ کو کہتے ہیں۔ پھر، یہ 'new_derived' کلاس کے '~new_derived()' طریقہ کو کال کرتا ہے اور بیس کلاس کا '~ new_base' دکھاتا ہے۔

مثال 3:

یہاں 'ورچوئل' کنسٹرکٹر بنانے کے لیے ایک اور کوڈ ہے۔ 'iostream' اور 'std' نام کی جگہ کو شامل کرنے کے بعد، ہم ایک کلاس 'B' تیار کرتے ہیں۔ اس کے نیچے، ہم 'عوامی' کنسٹرکٹر بناتے ہیں جو 'B()' ہے اور پھر 'cout' تیار کرتے ہیں۔ کنسٹرکٹر اور ڈسٹرکٹر فنکشنز کی تعریف ایک 'عوامی' رسائی اسپیفائر کا استعمال کرتے ہوئے کی جاتی ہے جس میں کلاس میں کوئی بھی شے کال کر سکتی ہے۔

اب، ہم اس بیس کلاس کا '~B()' ڈسٹرکٹر بھی بناتے ہیں جس میں ہم 'cout' کو دوبارہ استعمال کرتے ہیں۔ پھر، ہم 'D' کلاس بناتے ہیں جو کہ 'B' بیس کلاس کی اخذ کردہ کلاس ہے اور 'عوامی' کو یہاں رکھیں۔ اس 'عوامی' کے اندر، ہم بالترتیب 'D()' اور '~D' ناموں کے ساتھ اخذ شدہ کلاس کے کنسٹرکٹر کے ساتھ ساتھ ڈسٹرکٹر بھی بناتے ہیں۔ دونوں اپنے اندر 'cout' پر مشتمل ہیں۔ اب، ہمارے پاس 'main()' فنکشن ہے۔ اس فنکشن کو کال کرنے کے بعد، ہم بیس کلاس کا پوائنٹر آبجیکٹ تیار کرتے ہیں۔

پھر، ہم 'delete' کلیدی لفظ استعمال کرتے ہیں اور 'base_ptr' کو یہاں رکھتے ہیں۔ اس صورت میں، بیس کلاس کے پوائنٹر آبجیکٹ کو کال کر کے ڈسٹریکٹر کی جگہ کو حذف کر دیا جاتا ہے۔

کوڈ 3:

# شامل کریں
استعمال کرتے ہوئے نام کی جگہ std ;
کلاس بی
{
عوام :
بی ( )
{
cout << 'بیس کلاس کا کنسٹرکٹر' << endl ;
}
~ بی ( )
{
cout << 'بیس کلاس کا تباہ کن' << endl ;
}
} ;

کلاس ڈی : عوام بی
{
عوام :
ڈی ( )
{
cout << 'ماخوذ کلاس کا کنسٹرکٹر' << endl ;
}
~D ( )
{
cout << 'ماخوذ طبقے کا تباہ کن' << endl ;
}
} ;
int مرکزی ( )
{
بی * base_ptr = نئی ڈی ;
حذف کریں base_ptr ;
}

آؤٹ پٹ:
نتیجہ ظاہر کرتا ہے کہ یہ ایک پوائنٹر آبجیکٹ کا استعمال کرتا ہے جو مین فنکشن میں 'B' کلاس کی طرف اشارہ کرتا ہے۔ اس طرح، یہ 'B' کلاس کے 'constructor()' کو پہلے کہتا ہے۔ پھر، یہ 'D' کلاس کا 'constructor()' کہتا ہے۔ پوائنٹر آبجیکٹ جو 'B' اور 'D' کلاسوں کے تباہ کنوں کے پاس ہوتا ہے اسے پھر حذف کر دیا جاتا ہے۔ پروگرام کے اندر 'D' کلاس کے ڈسٹرکٹر کو مدعو کیے بغیر، 'B' کلاس پوائنٹر صرف 'B' کلاس کے ڈسٹرکٹر کو ختم کرتا ہے۔ نتیجتاً، پروگرام کی میموری خراب ہو جاتی ہے۔

نتیجہ

ہم نے C++ پروگرامنگ میں 'ورچوئل کنسٹرکشن' کے تصور پر تبادلہ خیال کیا۔ ہم نے دریافت کیا کہ ہم C++ میں ورچوئل کنسٹرکٹر نہیں بنا سکتے، لیکن ہم اپنے کوڈز میں ورچوئل ڈسٹرکٹر بنا سکتے ہیں۔ یہاں، ہم نے دکھایا کہ جب ہم C++ پروگرامنگ میں ورچوئل کنسٹرکٹر بناتے ہیں اور اپنے کوڈز میں ورچوئل ڈسٹرکٹر کے کام کرتے ہیں۔ ہم نے سیکھا کہ کنسٹرکٹر ورچوئل نہیں ہو سکتا، لیکن ہم اپنی کلاس میں ورچوئل ڈسٹرکٹر بنا سکتے ہیں۔ ہم نے کچھ مثالیں دکھائیں اور اس گائیڈ میں ان کوڈز کی اچھی طرح وضاحت کی۔