سؤال

كيفية تنفيذ الصب إلى فئة قاعدة خاصة في C ++؟ لا أريد استخدام الاختراقات مثل إضافة صديق وما إلى ذلك. لا يعمل تعريف مشغل الصب العام.

تعديل :

على سبيل المثال لدي:

class A {
//base class
}

class AX : private A {
//a child
}

class AY : private A {
//another specialized child
}

class B {
//base class
void do (A a) {//do
    }
}

class BX : private B {
//a child
void do (AX a) {
     B::do( static_cast <A> (a) );
    }
}

class BY : private B {
//another specialized child
void do (AY a) {
    B::do( static_cast <A> (a) );
    }
}

EDIT2

لماذا أفعل هذا؟

لنفترض أنه يجب علي تحديد بعض الممتلكات التي هي ثقيلة للغاية ويمكن أن تكون من عدة أنواع مماثلة (مثل Velocityx Velocityy وما إلى ذلك). ثم أريد أن أكون قادرًا على الحصول على فصول يمكن أن تحتوي على أي مجموعة من هذه الخصائص. إذا كنت أرغب في معالجة هذه الخصائص ، فمن الواضح ، أن أفضل إلقاءها على نوع القاعدة بدلاً من إضافة تطبيق لكل اختلاف. لا أستخدم الميراث العام لأنه من الأفضل أن نلقي بشكل صريح عند الحاجة من أن يكون الواجهة الخاصة مرئية ضمنيًا. ليست مشكلة حقيقية ولكن أود أن أحصل على حل :)

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

المحلول

إذا لم ينجح تحديد مشغل التصوير العام ، فيمكنك المحاولة بوظيفة منتظمة:

class D: private B {
    public:
        B& asB() { return static_cast<B&>(*this); }
};
...
D d;
d.asB().methodInB();
...

على أي حال ، ما هي النقطة؟ إذا D مستمد من القطاع الخاص من B, ، ثم ليس من المفترض أن تستخدم أ D ك B من الخارج.

نصائح أخرى

يمكنك فقط استخدام طراز C على طراز C. لا حاجة لأي "اختراقات" أو "تطبيقات". يخدم لفه في وظيفة واضحة أن الأشخاص السيئين "سيئون"

template<typename Targ, typename Src>
typename boost::enable_if<boost::is_base_of<Targ, Src>, Targ>::type &
private_cast(Src &src) { return (Targ&)src; }

للحصول على سلامة الممثلين ، تحتاج إلى التأكد من ذلك Targ هي في الواقع قاعدة خاصة أو عامة. يتم ذلك بواسطة boost::is_base_of.


بالطبع يجب أن تفضل وظائف الأعضاء في الفئة المشتقة المعنية التي تُرجع المؤشر الأساسي ، بدلاً من القيام بمثل هذه الممثلين..


تحديد مشغل الصب العام لا يعمل.

هذا ليس منطقيًا بالنسبة لي ... لماذا تجعل الفئة الأساسية خاصة على الإطلاق؟ فقط اجعلها علنية. السبب في أن وظائف التحويل الخاصة بك لا تعمل هو أن المعيار يتطلب ألا تنظر التحويلات الضمنية أبدًا void.

لدي حالة استخدام لهذا ؛ أنا أرث من فئة قاعدة كبيرة ومتقلب تضيف وظائف طوال الوقت ، ولم تكن وظيفة الفئة الأساسية ستعمل بشكل صحيح في فئة الفئة الفرعية الخاصة بي ، لذلك أرث بشكل خاص.

أعتقد أنه من الأبسط فقط إنشاء وظيفة تُرجع الفئة الأساسية. أدناه أنا أدرج برنامج تصحيح بالكامل ؛ يرجى محاولة تجميع التعليمات البرمجية الخاصة بك قبل إرسال سؤال ، لأن استخدام معرفات مثل "do" لأن أسماء الوظائف من المحتمل أن تجعل كل مترجم غير سعيد .. :-(: --(

class A {
  //base class                                                                                                                                                          
};

class AX : private A {
  //a child                                                                                                                                                             
 public:
  A *ToA() { return this; }
};

class AY : private A {
  //another specialized child                                                                                                                                           
 public:
  A *ToA() { return this; }
};

class B {
  //base class                                                                                                                                                          
 protected:
  void do_it (A a) {};
};

class BX : private B {
  //a child                                                                                                                                                             
  void do_it (AX a) {
    B::do_it( *a.ToA() );
  }
};

class BY : private B {
  //another specialized child                                                                                                                                           
  void do_it (AX a) {
    B::do_it( *a.ToA() );
  }
};

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