سؤال

هل هناك طريقة في C ++ لبناء فئتك بحيث تُعطى مؤشرًا لفصلك ، يمكنك توجيه Dynamic_cast <> () كيفية إلقاءها على فصل آخر تقوم بلفه للتنفيذ؟ هل يقوم المشغل بإجراء الخدعة؟ تخيل أن لدي فئة قاعدة واجهة مجردة واستنتج concretea من هذا وكذلك الخرسانة ، ولكن الخرسانة تلتف الواجهة إلى كائن من النوع concretea. إذا تلقيت طلبًا للالتفاف إلى Concretea من Concretea ، فأنا أرغب في العمل:

class Abstract {
public:
  virtual void interface() = 0;

};

class concreteA : public Abstract {
public:
  virtual void interface();

};

class concreteB : public Abstract {
public:
  concreteB(concreteA &underlying)
    : _underlying(&underlying) {
  }
  virtual void interface();

  operator concreteA*() {
    return _underlying;
  }

private:
  concreteA *_underlying;

};

void
myTest() {
  concreteA myClassA;
  concreteB myClassB(myClassA);
  Abstract *abstract = &myClassB;
  concreteA *underlying = dynamic_cast<concreteA *>(abstract);
}
هل كانت مفيدة؟

المحلول

لا ، يقوم فريق العمل الديناميكي بإخبار المترجم "لا أريد تغيير هذا الكائن على الإطلاق ، أريد فقط أن أحاول النظر إليه كما لو كان هذا النوع الآخر ، لكن لا تغيره. إذا كان عليك ذلك قم بتغييره ، أو عودة لاغية أو رمي استثناء. ". لن يحاول فريق العمل الديناميكي إجراء أي تحويلات من هذا القبيل نيابة عنك. لذلك ، تحتاج static_cast أو boost::lexical_cast.

هذا لأن المشغل الممثل يمكنه إما:

  • إعادة تفسير كائن موجود بطريقة جديدة دون تغييره
  • قم بتغيير كائن بطريقة ما من أجل إجباره على أن يكون نوعًا آخر ، مثل int -> قصير ، أو مزدوج -> int.

ويمكن أن تفعل الاحتجاج المصبوب واحد فقط واحد من هؤلاء ، وليس كلاهما.

لمزيد من المعلومات حول الطبيعة "المزدوجة" لمشغل الممثلين ، يمكنك أن ترى هذا المقال لإريك ليبرت, ، الذي يهدف إلى C# ولكن ينطبق في الغالب على C ++ أيضًا.

على وجه التحديد ، يمكنك رؤية الفقرة 5.2.7 في أحدث مسودة C ++ 0x - لا يتم تغيير هذا السلوك من C ++ 03.

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