سؤال

ال dynamic_cast يقوم المشغل بإرجاع الصفر (0) عندما أتقدم بطلب إلى مؤشر يشير إلى مثيل كائن موروث مضاعف. أنا لا أفهم لماذا.

التسلسل الهرمي:

class Field_Interface
{
  public:
    virtual const std::string get_field_name(void) const = 0; // Just to make the class abstract.
};


class Record_ID_Interface
{
  public:
    virtual bool has_valid_id(void) const = 0;
};


class Record_ID_As_Field
: public Field_Interface,
  public Record_ID_Interface
{
// This class behaves as a Field and a Record_ID.
// ...
}


// A demonstration function
void Print_Field_Name(const Field_Interface * p_field)
{
  if (p_field)
  {
    cout << p_field->get_field_name() << endl;
  }
  return;
}


// A main function for demonstration
int main(void)
{
  Record_ID_As_Field *  p_record_id = 0;
  p_record_id = new Record_ID_As_Field;
  if (p_record_id)
  {
     // (1) This is the trouble line
     Print_Field_Name(dynamic_cast<Field_Interface *>(p_record_id));
  }
  return 0;
}

اريد الحصول على Record_ID_As_Field أن تعامل على أنها أ Field_Interface, ، ولكن أيضا تناسب حيث Record_ID_Interface مطلوب.

لماذا dynamic_cast في (1) أعلاه العودة 0 ، وكيف يمكنني حل هذا؟

أنا أستخدم Visual Studion 2008 على Windows XP.

ملاحظة: من أجل البساطة ، أستخدم مؤشرات أساسية في هذا المثال. يستخدم الكود الفعلي boost::shared_ptr.

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

المحلول

ملاحظة: من أجل البساطة ، أستخدم مؤشرات أساسية في هذا المثال. يستخدم الكود الفعلي boost::shared_ptr.

وهذه هي مشكلتك هناك: لا يمكنك ذلك dynamic_cast أ shared_ptr<A> إلى shared_ptr<B> نظرًا لأن هذين النوعين لا يرتبطون بالفعل ببعضهما البعض ، حتى لو A و B نكون.

لحسن الحظ في الحالة المحددة في سؤالك dynamic_cast لا ينبغي أن تكون ضرورية ، منذ ذلك الحين Record_ID_As_Field* يجب أن تكون قابلة للتحويل ضمنيًا إلى أ Field_Interface* (لأن واحد مشتق من الآخر). shared_ptr تنفذ مشغلي التحويل الذين يرفعون هذه التحويلات الضمنية إلى المعلق shared_ptr كائنات ، هكذا shared_ptr<Record_ID_As_Field> يجب أن تكون قابلة للتحويل ضمنيًا إلى shared_ptr<Field_Interface>.

إذا تركت dynamic_cast, ، يجب أن تعمل.

إذا كنت بحاجة فعليًا إلى القيام بممثلة ديناميكية ، فيمكنك استخدام ملف مُنشئ خاص المقدمة من قبل shared_ptr:

shared_ptr<Record_ID_As_Field> raf;
shared_ptr<Field_Interface> fi(raf, dynamic_cast<FieldInterface*>(raf.get());

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

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