ما الفرق بين إنشاءات الوظائف الافتراضية في C++؟

StackOverflow https://stackoverflow.com/questions/1420552

سؤال

ما الفرق بين الإعلانين التاليين؟

virtual void calculateBase() = 0;  
virtual void calculateBase();

قرأت أن الوظيفة الأولى (=0) هي "وظيفة مجردة خالصة" ولكن ما الذي يجعل الوظيفة الثانية؟

هل كانت مفيدة؟

المحلول

واحد يسمى الأول دالة ظاهري خالصة. وظائف افتراضية نقية عادة ليس لديها أي تنفيذ وأنت لا تستطيع إنشاء مثيل من فئة تحتوي على دالة الظاهري خالصة.

واحد الثاني هو دالة ظاهري (أي "طبيعية" وظيفة الظاهرية). توفر فئة التنفيذ لهذه المهمة، ولكن فئتها المستمدة يمكن تجاوز هذا التنفيذ من خلال توفير تنفيذه الخاصة لهذا الأسلوب.

نصائح أخرى

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

  • ال "طريقة القالب" نمط التصميم، حيث تقوم الفئة الأساسية بتنفيذ بنية حول استدعاء الوظيفة، ولكن يجب ملء تفاصيل استدعاء الوظيفة بواسطة الفئة المشتقة، و
  • نمط تصميم "الواجهة"، لأن C++ لا تحتوي على الكلمة الأساسية للواجهة.تعد الفئات الأساسية المجردة، التي تحتوي بشكل مثالي على وظائف افتراضية خالصة فقط وبدون بيانات أعضاء، هي طريقة C++ لتعريف الواجهات.

الإعلان الثاني هو مجرد إعلان وظيفة عضو افتراضي عادي.سوف تحصل على أخطاء المترجم إذا فشلت في تنفيذ وظيفة العضو في الفئة الأساسية.لا يزال افتراضيًا مما يعني أنه قد يكون من المفيد تجاوز السلوك في فئة مشتقة.

وليس لدى أول واحد ليتم تنفيذها في الفئة الأساسية، ولكن يفرض أن يتم تنفيذها في الطبقات الموروثة.

لديك لتنفيذ ثانية واحدة في الفئة الأساسية ويمكن تنفيذها في الطبقات الموروثة.

وأساسا، عندما وراثة، كنت إرغام لتجاوز أول واحد، و<م> السماح لتجاوز ثانية واحدة.

والقادمة من جاوة، أليس كذلك؟

وأعتقد أنك خلط المصطلحات ...

virtual void x() = 0;

وهو ظاهري على وظيفة نقية ، أو وظيفة أو مجردة. بل هو وظيفة افتراضية دون تنفيذ. أنت تتحدث عن فئة مجردة صافية، وهو ج ++ يعادل واجهة، عن فئة جود وظائف فقط مجردة.

virtual void x();

وهو دالة ظاهري، وهذا يعني أنه يمكن إعادة تعريف في الفئات المشتقة، ولكنها ليست مجردة، لذلك يجب توفير تطبيق لذلك.

<اقتباس فقرة>   

والظاهرية الفراغ calculateBase () = 0؛

وظيفة الأولى هي دالة الظاهري الصرفة التي لا يمكن أن يتم تنفيذ في فئة والتصرف فئة مجردة كما نقية أو فئة واجهة. وينبغي أن يتم التنفيذ الملموس أو طغت في فئة فرعية. انها بمثابة فئة واجهة لفئات المشتقة منها.

<اقتباس فقرة>   

وcalculateBase الفراغ الظاهري ()؛

وهذه هي وظيفة وظيفة افتراضية حيث التنفيذ (الافتراضي) ويمكن أن يتم في الفئة الأساسية. ولكن، فئة مشتقة يجب أن طغت imeplementation تلقاء نفسها.

في جاوة

virtual void calculateBase() = 0;  

وسيكون

abstract void calculateBase();

و

virtual void calculateBase();

وسيكون

void calculateBase();

لتكون واضحة تماما،

void calculateBase();

وفي C ++، هو "نفس" ك

final void calculateBase();

وفي جاوة. وهذا هو، النهائي هو "الافتراضي" في C ++. هناك استثناء لهذه القاعدة ولكن. عندما شاء subclasses ترث فئة مع أسلوب ظاهري وreimplementing دون باستخدام الكلمة الافتراضية، الأسلوب في فئة فرعية سوف <م> لا نهائيا.

يجب أن يكون للوظيفة الثانية تطبيق في الفصل الذي يعلن عنها (عدم وجود '= 0')، و يستطيع يمكن تجاوزها بواسطة الفئات الفرعية.

قد يكون للوظيفة الأولى تطبيق في الفئة التي تعلن عنها أو لا يكون لها لديه ليتم تنفيذها من قبل الفئات الفرعية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top