أولاً، دعونا نقدم نقطة معرفتنا الجديدة - الوظيفة الافتراضية .
ما هو نوع هذه الوظيفة؟ لتبسيط الأمر، إنها دالة مُعلن عنها بالظاهرية أمام الدالة، والشكل العام هو كما يلي:
اسم الوظيفة لقيمة الإرجاع للوظيفة الافتراضية (المعلمة الرسمية) {نص الوظيفة}
إذن ما هو استخدامه؟ يسمح ظهور الوظائف الافتراضية بإنشاء اتصال بين الوظيفة وجسم الوظيفة في وقت التشغيل، وهو ما يسمى بالربط الديناميكي . ثم عند تشغيل الفئة المشتقة من الوظيفة الافتراضية، يمكن تحقيق تأثير تنفيذ نفس الطريقة ولكن بنتائج مختلفة وفقًا للربط الديناميكي في وقت التشغيل، وهو ما يسمى بتعدد الأشكال. وبهذه الطريقة، توجد طريقة لحل المشكلة في القسم السابق.
بعد ذلك، نحتاج فقط إلى الإعلان عن طريقة المنطقة في الفئة الأساسية كوظيفة افتراضية، وبعد ذلك يمكن استدعاء أي مؤشر أو مرجع من النوع Point في الوظيفة الرئيسية بجرأة، ولا داعي للقلق بشأن مشكلات الكتابة. لأنهم سيقررون الطريقة التي سيتم الاتصال بها بناءً على نوع الكائن الفعلي لتحقيق الارتباط الديناميكي.
الرمز هو كما يلي:
/***************************: /حقوق النشر:www.dotcpp.com//التاريخ:2017/12/20********************************* *** *******/#include<iostream>usingnamespacestd;#definePI3.1415926classPoint{private:intx,y;public:Point(intx=0,inty=0){this->x=x;this ->y =y;}virtualdoublearea(){return0.0;}};classCircle:publicPoint{private:intr;public:Circle(intx,inty,intR):Point(x,y){r=R;}doublearea (){ returnPI*r*r;}};intmain(){PointA(10,10);cout<<A.area()<<endl;CircleB(10,10,20);cout<<B.area ()< <endl;Point*p;p=&B;cout<<p->area()<<endl;Point&pp=B;cout<<pp.area()<<endl;return0;}
بعد التعديل، تجميع وتشغيل على النحو التالي:
يرجى التجربة على جهاز الكمبيوتر الخاص بك لتجربة دور الوظائف الافتراضية وتعدد الأشكال.
الأشياء التي يجب ملاحظتها هي:
1. لا يمكن أن تكون الوظائف الافتراضية وظائف أعضاء ثابتة أو وظائف أصدقاء لأنها لا تنتمي إلى كائن.
2. لا يمكن للوظائف المضمنة تحديد موقعها ديناميكيًا أثناء وقت التشغيل. حتى إذا تم تعريف الوظيفة الافتراضية داخل الفصل، فستظل تعتبر غير مضمنة أثناء التجميع.
3. لا يمكن أن يكون المنشئ وظيفة افتراضية، ويمكن أن يكون المدمر وظيفة افتراضية، وعادة ما يتم الإعلان عنه كوظيفة افتراضية.