هل أنا بحاجة إلى استخدام dynamic_cast عند استدعاء دالة التي تقبل الفئة الأساسية؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

ولدي بعض الفئات مثل هذا:

interface class IA
{
};

interface class IB
{
};

public ref class C : public IA, public IB
{
};

public ref class D
{
    void DoSomething(IA^ aaa)
    {
    }

    void Run()
    {
        C^ bob = gcnew C();
        DoSomething(dynamic_cast<IA^>(bob));    // #1
        DoSomething(bob);           // #2
    }
};

في هذه اللحظة أنا دائما في محاولة لاستخدام صب الديناميكي عند استدعاء هذه الوظيفة، (رقم 1 أعلاه).
ومع ذلك فإنه لا تجعل رمز قبيح للغاية، لذلك أريد أن أعرف ما إذا كان من الضروري في الواقع.

هل تستخدم dynamic_cast في هذا الطريق؟ إذا كان الأمر كذلك فما هو السبب الرئيسي؟

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

المحلول

وبما أننا نعرف bob هو من نوع C^، ونحن نعرف في وقت الترجمة يمكن downcasted إلى IA^ بسلام، وهكذا dynamic_cast ما يعادل static_cast هنا. وعلاوة على ذلك، ويلقي ضمني لك اقتراح هو أيضا آمن.

وهناك حاجة dynamic_cast فقط عندما upcasting من النوع الأساسي لمشتقة.

نصائح أخرى

في مستوى C ++، يمكنك استخدام dynamic_cast إلى السير في التسلسل الهرمي، لا يصل. في هذه الحالة، يجب أن تستخدم ذلك في محاولة لتحويل IA أو IB إلى C:

IA^ temp = /* get a C in some way. */;
C^ tempC = dynamic_cast<C^>(temp);

لا، أعتقد أن في C ++ / CLI أنت أيضا لا تحتاج المدلى بها الديناميكي هنا. المستمدة * تحويل ضمنيا إلى قاعدة * اذا لم يكن هناك غموض w.r.t. وراثة متعددة. ونفس الشيء ربما ينطبق على "القيادة العامة مؤشرات". في C ++ يلقي الديناميكي - عندما upcasting - يتطلب فئات متعددة الأشكال (واحد على الأقل وظيفة الظاهرية). أنا لا أعرف كيف C ++ / CLI يعالج، وأن كان. أعتقد أن كل فئة CLI هي عن طريق متعدد الأشكال الافتراضية.

وأنت قد تحتاج إلى إزالة علامة C ++، بالمناسبة. ؛)

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