الفرق في السلوك أثناء استخدام Dynamic_Cast مع الإشارة والمؤشرات

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

  •  16-09-2019
  •  | 
  •  

سؤال

كنت أتحقق من سلوك Dynamic_Cast ووجد أنه عندما يفشل، يتم إلقاء استثناء STD :: BAD_CACT إلا إذا كانت الوجهة نوع مرجعي. إذا كانت الوجهة هي نوع مؤشر، فلا يتم طرح أي استثناء من المصبوب. هذا هو نموذجي عينة:

class A
{
    public:
        virtual ~A()
        {
        }
};

class B : public A
{
};

int  main()
{
    A* p = new A;

    //Using reference
    try
    {
    B& b = dynamic_cast<B&>(*p);
    }
    catch(std::bad_cast exp)
    {
    std::cout<<"Caught bad cast\n";
    }

    //Using pointer
      try
    {
    B* pB = dynamic_cast<B*>(p);

    if( pB == NULL)
    {
        std::cout<<"NULL Pointer\n";
    }
    }
    catch(std::bad_cast exp)
    {
    std::cout<<"Caught bad cast\n";
    }

    return 0;
}

الناتج هو "اشتعلت سيئا" و "مؤشر فارغة". يتم تجميع الرمز باستخدام VS2008. هل هذا هو السلوك الصحيح ؟ إذا كانت الإجابة بنعم، فلماذا هناك فرق؟

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

المحلول

نعم، هذا هو السلوك الصحيح. السبب هو أنه يمكنك الحصول على مؤشر فارغ، ولكن ليس مرجعا فارغا - يجب أن يكون هناك أي إشارة إلى كائن.

لذلك عندما تفشل Dynamic_Cast لنوع المؤشر، فمن بإرجاع مؤشر فارغ يمكن للمتصل التحقق من ذلك، ولكن عندما يفشل في نوع مرجعي لا يمكنه إرجاع مرجع فارغ، لذلك الاستثناء هو الطريقة المعقولة الوحيدة للإشارة إلى مشكلة وبعد

نصائح أخرى

انظر المعيار C ++، القسم 5.2.7 / 9:

9 يتمثل قيمة فاشلة من نوع المؤشر هي قيمة المؤشر Null لنوع النتيجة المطلوبة. فاشل يلقي إلى نوع المرجع يلقي bad_cast (18.5.2).

أما لماذا - هذه هي كلمات Stroustrup من كتاب D & E، القسم 14.2.2:

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

نعم، 5.2.7 / 9

قيمة الوضوح الفاشلة إلى نوع المؤشر هي قيمة المؤشر NULL لنوع النتيجة المطلوبة. فاشل يلقي إلى نوع المرجع يلقي bad_cast (18.5.2).

نعم إنه كذلك. لان dynamic_cast لا يمكن إرجاع NULL ل Eالمين للرجوعية الفاشلة، وهو استثناء هو السبيل الوحيد للخروج.

وهذا هو، والرجوع لا يمكن أن يكون فارغا، لذلك لا يوجد شيء مناسب للعودة.

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