سؤال

لقد تم القبض علي بهذه المشكلة أكثر من مرة:

class A{
public:
  virtual ~A() {}
  virtual int longDescriptiveName(){ return 0; }
};

class B: public A{
public:
  virtual int longDescriptveName(){ return 1; } // Oops
};

إذا كانت الوظيفة افتراضية نقية، فإن التحويل البرمجي يمسك الخطأ. ولكن إذا لم يكن الأمر كذلك، فقد يكون هذا خطأ فظيعا لتتبعه. جزء من المشكلة هو أن أسماء الوظائف قد تكون طويلة جدا. لكن ما زلت أتساءل، هل هناك طريقة لرؤية هذه الأخطاء في وقت سابق؟

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

المحلول

احتمال واحد هو الوظيفة الافتراضية الخالصة المستخدمة مع التنفيذ:

virtual int longDescriptiveName() = 0
{
    return 0; 
}

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

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

نصائح أخرى

إذا قمت بتجميعها مع Microsoft Visual C ++ 2005 أو الأحدث، فهناك التمديد غير القياسية السماح لك بالكتابة:

virtual int longDescriptveName() override { return 1; }

وسوف يشكو المحول البرمجي. إذا قمت بتجميعها أيضا مع مترجمات محكمات أخرى، فمن المحتمل أنها ذكية لجعل #Define حتى تتمكن من التحكم في السلوك.

سؤال NECRO'D القديم، ولكن طريقة جيدة واحدة هي اختبار مبكرا، سواء رسميا مع اختبارات الوحدات، أو أكثر بشكل غير رسمي، قبل البدء في استخدام فصولك. بمعنى آخر، تحقق في وقت مبكر على ذلك:

A test_a;
B test_b;
A& poly_a = test_a;
A& poly_b = test_b;
assert(poly_a.longDescriptiveName() == 0);
assert(poly_b.longDescriptiveName() == 1);

قبل تكتب 10،000 خطوط إضافية من التعليمات البرمجية التي تستخدم فصولك.

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