C ++ الوصول إلى الفصل الدراسي المشتق من مؤشر الفئة الأساسية

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

سؤال

إذا قمت بتخصيص كائن من الفصل Derived (مع فئة قاعدة من Base)، وتخزين مؤشر لهذه الكائن في متغير يشير إلى الفئة الأساسية، كيف يمكنني الوصول إلى أعضاء Derived صف دراسي؟

إليك مثال:

class Base
{
    public:
    int base_int;
};

class Derived : public Base
{
    public:
    int derived_int;
};

Base* basepointer = new Derived();
basepointer-> //Access derived_int here, is it possible? If so, then how?
هل كانت مفيدة؟

المحلول

لا، لا يمكنك الوصول derived_int لأن derived_int هو جزء من Derived, ، في حين basepointer هو مؤشر ل Base.

يمكنك أن تفعل ذلك في الاتجاه الآخر رغم ذلك:

Derived* derivedpointer = new Derived;
derivedpointer->base_int; // You can access this just fine

ترث الطبقات المشتقة أعضاء الفصل الأساسي، وليس العكس.

ومع ذلك، إذا الخاص بك basepointer كان يشير إلى مثيل Derived ثم يمكنك الوصول إليها من خلال الممثلين:

Base* basepointer = new Derived;
static_cast<Derived*>(basepointer)->derived_int; // Can now access, because we have a derived pointer

لاحظ أنك ستحتاج إلى تغيير ميراثك public أول:

class Derived : public Base

نصائح أخرى

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

class Base 
{ 
protected:
 virtual int &GetInt()
 {
  //Die horribly
 }

public: 
 int base_int; 
}; 

class Derived : Base 
{ 
  int &GetInt()
  {
    return derived_int;
  }
public: 
int derived_int 
}; 

basepointer->GetInt() = 0;

إذا basepointer نقاط كشيء آخر Derived, ، سوف يموت البرنامج بشكل فظيع، وهو النتيجة المقصودة.

بدلا من ذلك، يمكنك استخدام dynamic_cast<Derived>(basepointer). وبعد ولكن تحتاج إلى وظيفة افتراضية واحدة على الأقل في Base لذلك، وكن مستعدا لمواجهة صفر.

ال static_cast<>, ، مثل بعض تشير، هي طريقة مؤكدة لإطلاق النار على نفسك في القدم. لا تسهم في ذاكرة التخزين المؤقتة الواسعة من قصص الرعب "غير المشروفة لعائلة اللغة C".

يمكنك استخدام CRTP.

يمكنك استخدام الفئة المشتقة بشكل أساسي في القالب للفئة الأساسية

من الممكن عن طريق السماح للفئة الأساسية بمعرفة نوع الفئة المشتقة. يمكن القيام بذلك عن طريق جعل الفئة الأساسية قالب من النوع المشتق. يسمى هذا C ++ Idiom نمط قالب متكرر الغريب.

معرفة الفئة المشتقة، يمكن أن يكون مؤشر الفئة الأساسية مصبين ثابتا إلى مؤشر للنوع المشتق.

template<typename DerivedT>
class Base
{
public:
    int accessDerivedField()
    {
        auto derived = static_cast<DerivedT*>(this);
        return derived->field;
    }
};


class Derived : public Base<Derived>
{
public:
    int field;
};

int main()
{
    auto obj = new Derived;
    obj->accessDerivedField();
}

// إذا كنت تعرف ما هي الفئة المشتقة التي ستستخدمها

مشتق * derisspointer = dynamic_cast <المشتق *> basePointer؛

// ثم يمكنك الوصول إلى فئة مشتقة باستخدام DeriveDiner

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