سؤال

إذا فهمت بشكل صحيح ، يمكن لـ TypeID تحديد النوع الفعلي في تعدد الأشكال ، بينما لا يمكن لـ typeof.

هل صحيح أيضًا أن عوائدهم تستخدم لأغراض مختلفة: يتم استخدام إرجاع typeof ككلمة رئيسية نوع يمكن أن تحدد المتغير ، ولكن عودة typeid لا يمكن؟

هل هناك أي طريقة للحصول على النوع الفعلي للتعدد الأشكال واستخدام الإرجاع ككلمة رئيسية للكلمة لتحديد متغير آخر؟ آمل أن أحصل على نوع الفئة المشتقة من مؤشر يشير إلى الفئة الأساسية وتحديد متغير أو مؤشر إلى الفئة المشتقة. شيء مثل:

baseclass *p = new derivedclass  
typexxx(*p) *pp = dynamic_cast<typexxx(*p) *> (p); 
// would like to convert the pointer from pointing to a base class 
// to its derived class

شكرا جزيلا لك!

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

المحلول

C ++ 0x سوف نحصل على decltype التي يمكن استخدامها مثل هذا:

int someInt;
decltype(someInt) otherIntegerVariable = 5;

ولكن من أجل C ++ القديم البسيط ، لسوء الحظ ، لا.

أفترض ذلك decltype لن تكون مساعدة كثيرًا أيضًا نظرًا لأنك تريد النوع متعدد الأشكال ، ليس النوع المعلن. الطريقة الأكثر مباشرة إلى الأمام للقيام بما تريد NULL.

struct A {
    virtual ~A() {}
};
struct B : public A {};
struct C : public A {};

int main() {
    A* x = new C;
    if(B* b_ptr = dynamic_cast<B*>(x)) {
        // it's a B
    } else if(C* c_ptr = dynamic_cast<C*>(x)) {
        // it's a C
    }
}

نصائح أخرى

على افتراض تسلسل هرمي A <- B <- C

A * p = new AorBorC;   // create new object of some sort

if ( dynamic_cast <C*>(p) ) {
  C * c = dynamic_cast <C*>(p);
  c->CFunc();
}
else if ( dynamic_cast <B*>(p) ) {
  B * b = dynamic_cast <B*>(p);
  b->BFunc();
}
else if ( dynamic_cast <A*>(p) ) {
  A * a = dynamic_cast <A*>(p);
  a->AFunc();
}

حيث Afunc ، bfunc ، cfunc تكون خاصة بفئات كل منها ، وليست افتراضية. من الواضح أن هذا يمكن تحسينه إلى حد ما.

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