C ++ الوصول إلى الفصل الدراسي المشتق من مؤشر الفئة الأساسية
-
19-09-2019 - |
سؤال
إذا قمت بتخصيص كائن من الفصل 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