سؤال

لدي مشكلة باستخدام أ shared_ptr من فئة أساسية ، لا يمكنني أن أكون قادرًا على استدعاء أساليب الفئة المشتقة عند إلحاقها. أعتقد أن الكود سيكون أكثر مطوّلة مني:

class Base : public boost::enable_shared_from_this<Base>
{
  public:
    typedef  boost::shared_ptr<BabelNet> pointer;
};

class Derived : public Base
{
  public:
     static pointer  create()
                {
                        return pointer(new Derived);
                }
     void             anyMethod()
     {
        Base::pointer foo = Derived::create();
        // I can't call any method of Derived with foo
        // How can I manage to do this ?
        // is dynamic_cast a valid answer ?
        foo->derivedMethod(); // -> compilation fail
     }

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

المحلول

نرى Static_cast مع Boost :: shared_ptr؟

ستحتاج إلى استخدام Dynamic_pointer_cast للحصول على ما هو مناسب shared_ptr مثيل. (المقابلة ل dynamic_cast)

نصائح أخرى

مشترك مؤشر أم لا ، عندما يكون لديك مؤشر إلى Base, ، يمكنك فقط استدعاء وظائف الأعضاء من Base.

إذا كنت بحاجة حقا dynamic_cast, ، يمكنك استخدام dynamic_pointer_cast من تعزيز, ، لكن من المحتمل أن لا ينبغي عليك ذلك. بدلاً من ذلك ، فكر في تصميمك: Derived هو Base, ، وهذه علاقة قوية للغاية ، لذا فكر بعناية Base واجهة وإذا كان النوع الخرساني يجب أن يكون معروفًا حقًا.

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

الكود الخاص بك لن يعمل حتى مع المؤشرات الخام.

تحتاج إما للإعلان derivedMethod() الطريقة حتى في الفئة الأساسية أو أن يكون لديك مؤشر إلىDerived هدف.

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