منشئ C++ الظاهري

Mnshy C Alzahry



لا تسهل علينا لغة C++ إنشاء مُنشئات افتراضية لأنه من غير الممكن تجاوز مُنشئ الفصل. لذا، فإن المحاكاة الافتراضية للمنشئ لا معنى لها. لا يوجد مفهوم لإنشاء منشئ افتراضي في برنامج C++، ولكن يمكننا إنشاء المدمر الافتراضي هناك. يمكننا أيضًا تعريفه نظرًا لأن برمجة مُنشئ في لغة C++ لا يمكن اعتبارها افتراضية لأنه عند استدعاء مُنشئ الفصل، لا تحتوي الذاكرة على جدول افتراضي مما يشير إلى أنه لم يتم إنشاء أي مؤشر افتراضي. وبالتالي، يجب أن يكون المنشئ غير افتراضي في جميع الأوقات.

ومع ذلك، يمكن أن يكون هناك مدمر افتراضي. سنعرض هنا ما يحدث عندما نقوم بإنشاء مُنشئ افتراضي في لغة C++ بالإضافة إلى طريقة عمل المدمر الافتراضي بدلاً من المنشئ الافتراضي.

مثال 1:

لنقم بإنشاء المُنشئ الافتراضي ونبدأ الكود الخاص بنا عن طريق وضع ملف الرأس 'iostream'. ملف الرأس هذا مخصص للوظائف المعلنة فيه مثل 'cin' و'cout'. بعد ذلك، نضيف مساحة الاسم 'std'، لذلك لا يمكننا إضافة 'std' مع كل وظيفة في الكود الخاص بنا. بعد ذلك، نقوم بإنشاء فئة وهي الفئة الأساسية للكود الخاص بنا بالاسم 'my_base' ثم نضيف 'عام' لإنشاء المنشئ الافتراضي.







يتم إنشاء المنشئ الافتراضي هنا عن طريق وضع الكلمة الأساسية 'الافتراضية'. داخل هذا المنشئ الافتراضي، نضع عبارة 'cout'. أسفل هذا، نقوم بإنشاء وظيفة تسمى 'show' والتي نستخدم فيها 'cout' مرة أخرى. بعد ذلك، نقوم بإنشاء فئة مشتقة من هذه الفئة الأساسية بالاسم 'my_derived' ثم نقوم بتأسيس المُنشئ 'my_derived()' في الحقل 'public'. نقوم بإدراج عبارة 'cout' في مُنشئ 'my_derived()' هذا. أسفله، نقوم بإنشاء وظيفة تسمى 'show' حيث نستفيد من 'cout' مرة أخرى.



الآن، بعد استدعاء 'main()'، نقوم بإنشاء مؤشر للفئة الأساسية بالاسم 'my_ptr' وكذلك إنشاء كائن للفئة المشتقة وهو 'Obj_d'. بعد ذلك، نقوم بتعيين عنوان 'Obj_d' إلى 'my_ptr'. ثم نستدعي الدالة 'show()' من خلال 'my_ptr'.



الكود 1:





#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل my_base
{
عام :
افتراضي my_base ( )
{
cout << 'هنا صفي الأساسي' << endl ;
}
فارغ يعرض ( )
{
cout << 'وظيفة العرض للفئة الأساسية' << endl ;
}
} ;
فصل my_derived : عام my_base
{
عام :
my_derived ( )
{
cout << 'هنا صفي المشتق' << endl ;
}
فارغ يعرض ( )
{
cout << 'وظيفة العرض للفئة المشتقة' < يعرض ( ) ;
}

انتاج:
تظهر هنا رسالة خطأ تفيد بأنه لا يمكن إعلان المنشئ افتراضيًا في برمجة C++. لذلك، يمكننا أن نرى أن لغة C++ لا تسمح لنا بإنشاء المنشئ الظاهري ولكن يمكننا إنشاء المدمر الظاهري.



مثال 2:

دعونا نحل المشكلة السابقة وننشئ أداة التدمير الافتراضية في هذا الكود. بعد الإعلان عن فئة 'new_base'، نضع المنشئ 'العامة' الذي ننشئ فيه المدمر الظاهري عن طريق إضافة '~ ~' مع 'new_base'. نقوم بإدخال عبارة 'cout' في أداة التدمير الافتراضية هذه. أسفله، نقوم ببناء وظيفة تسمى 'show' والتي تستخدم 'cout'. بعد ذلك، نقوم بإنشاء فئة مشتقة 'new_derived' من هذه الفئة الأساسية 'new_base' وننشئ أداة التدمير 'new_derived()' في الحقل 'public'. تمت إضافة أداة التدمير 'new_derived()' هذه الآن إلى عبارة 'cout'.

أدناه، نقوم بإنشاء وظيفة تسمى 'show' والتي تستخدم عبارة 'cout' مرة أخرى. بعد استدعاء الدالة 'main()'، ننتج الآن كائنًا من الفئة المشتقة 'obj_d' بالإضافة إلى مؤشر للفئة الأساسية يسمى 'ptr1'. بعد ذلك، نعطي عنوان 'obj_d' إلى 'ptr1'. بعد ذلك، يتم استدعاء الأسلوب 'show()' باستخدام 'ptr1'.

الكود 2:

#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل new_base
{
عام :
افتراضي ~new_base ( )
{
cout << 'أداة تدمير الفئة الأساسية موجودة هنا' << endl ;
}
فارغ يعرض ( )
{
cout << 'وظيفة العرض للفئة الأساسية' << endl ;
}
} ;
فصل new_derived : عام new_base
{
عام :
~new_derived ( )
{
cout << 'أداة تدمير الفئة المشتقة موجودة هنا' << endl ;
}
فارغ يعرض ( )
{
cout << 'وظيفة العرض للفئة الأساسية' < يعرض ( ) ;
}

انتاج:
يستخدم هذا البرنامج كائن مؤشر من 'new_base' يشير إلى الفئة المشتقة من 'obj_d'. وبالتالي، فإنه يستدعي الأسلوب 'show()' للفئة 'new_base' أولاً. ثم يستدعي الأسلوب '~new_derived()' للفئة 'new_derived' ويعرض '~new_base' للفئة الأساسية.

مثال 3:

إليك رمزًا آخر لإنشاء المُنشئ 'الافتراضي'. بعد تضمين مساحة الاسم 'iostream' و'std'، نقوم بإنشاء فئة 'B'. أسفل هذا، نقوم بإنشاء المُنشئ 'العام' وهو 'B()' ثم نقوم بإنشاء 'cout'. يتم تعريف وظائف المنشئ والمدمر من خلال استخدام محدد وصول 'عام' يمكن لأي كائن في الفصل الاتصال به.

الآن، نقوم أيضًا بإنشاء أداة التدمير '~B()' لهذه الفئة الأساسية التي نستخدم فيها 'cout' مرة أخرى. بعد ذلك، نقوم بإنشاء الفئة 'D' وهي الفئة المشتقة من الفئة الأساسية 'B' ونضع الفئة 'العامة' هنا. داخل هذا 'العام'، نقوم بإنشاء المُنشئ وكذلك المدمر للفئة المشتقة بالأسماء 'D()' و'~D'، على التوالي. كلاهما يحتوي على 'cout' بداخلهما. الآن، لدينا الدالة 'main()'. بعد استدعاء هذه الوظيفة، نقوم بإنشاء كائن المؤشر للفئة الأساسية.

بعد ذلك، نستخدم الكلمة الأساسية 'delete' ونضع 'base_ptr' هنا. في هذه الحالة، يتم حذف مساحة المدمر عن طريق استدعاء كائن المؤشر للفئة الأساسية.

الكود 3:

#تشمل
استخدام مساحة الاسم الأمراض المنقولة جنسيا ;
فصل ب
{
عام :
ب ( )
{
cout << 'منشئ الفئة الأساسية' << endl ;
}
~ ب ( )
{
cout << 'مدمر الطبقة الأساسية' << endl ;
}
} ;

فصل د : عام ب
{
عام :
د ( )
{
cout << 'منشئ الطبقة المشتقة' << endl ;
}
( )
{
cout << 'المدمر للفئة المشتقة' << endl ;
}
} ;
كثافة العمليات رئيسي ( )
{
ب * base_ptr = جديد د ;
يمسح base_ptr ;
}

انتاج:
تظهر النتيجة أنه يستخدم كائن مؤشر يشير إلى الفئة 'B' في الوظيفة الرئيسية. وبالتالي، فإنه يستدعي 'المنشئ ()' للفئة 'B' أولاً. ثم يقوم باستدعاء 'المنشئ ()' للفئة 'D'. يتم بعد ذلك حذف كائن المؤشر الذي تحتفظ به أدوات التدمير للفئتين 'B' و'D'. بدون استدعاء أداة التدمير للفئة 'D' داخل البرنامج، يقوم مؤشر الفئة 'B' بإزالة أداة التدمير للفئة 'B' فقط. ونتيجة لذلك، تلف ذاكرة البرنامج.

خاتمة

ناقشنا مفهوم 'البناء الافتراضي' في برمجة C++. لقد اكتشفنا أنه لا يمكننا إنشاء المنشئ الظاهري في لغة C++، ولكن يمكننا إنشاء المدمر الظاهري في أكوادنا البرمجية. لقد أظهرنا هنا ما حدث عندما أنشأنا المنشئ الافتراضي في برمجة C++ وطريقة عمل المدمر الافتراضي في أكوادنا. لقد تعلمنا أن المنشئ لا يمكن أن يكون افتراضيًا، ولكن يمكننا إنشاء المدمر الافتراضي في فصلنا. لقد عرضنا بعض الأمثلة وشرحنا هذه الرموز بشكل شامل في هذا الدليل.