هل يمكنني تعليم Dynamic_cast <> () حيل جديدة؟
-
27-09-2019 - |
سؤال
هل هناك طريقة في 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.