الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

سؤال بكود عن Typeid

بدأه مريتعي في 7 مايو 2009 · 6 رد · 602 مشاهدة · في الأسئلة المجابة
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكــم ورحمـة الله وبركاتــه ،،

#include <iostream>
#include <typeinfo>
using namespace std;

struct A { virtual ~A() {cout<<"AA";} };
struct B : A { };

struct C { };
struct D : C { };

int main() {
  B bobj;
  A* ap = &bobj;
  A& ar = bobj;
  cout << "ap: " << typeid(*ap).name() << endl;
  cout << "ar: " << typeid(ar).name() << endl;

  D dobj;
  C* cp = &dobj;
  C& cr = dobj;
  cout << "cp: " << typeid(*cp).name() << endl;
  cout << "cr: " << typeid(cr).name() << endl;
B * b2 = dynamic_cast<B*>(ap);   /* NULL */

system("pause");
return 0;
}

الحين لما سويت له رن

طلع لي الاتي
ap: B
ar: B
cp: C
cr: C

ليش طلع ap 
من نوع B
مع انه بوينتر من كلاس 
A


السؤال الثاني

الحين اذا شلت 

 virtual ~A() {cout<<"AA";

تصير

B * b2 = dynamic_cast<B*>(ap);   /* NULL */

ايرور يعني مايمشي الداينمك كاست

ليش ووش علاقتهم ببعض

وشكرا جزيلا :wub:

تم تعديل هذه المشاركة بواسطة مريتعي في 7 مايو 2009 في 23:11

#2

امنتكم بالله تردون

عندي اختبار وحاااااااااااااايسه

الله يوفق الي يساعدني ويفرج كل همومه ويرزقه من حيث لايحتسب

#3

السلام عليكم

السر كله موجود فى الكلمه virtual

وجودها جعل الستركت A متعدد الواجهات polymorphic بمعنى

ان أى مؤشر من نوع الستركت A عندما يشير الى كائن من ستركت مشتق من A يصبح من نوع الستركت المشتق

حاولى تحزفى كلمة virtual وأيضا السطر اللى فيه dynamic_cast وشوفى الناتج

تجدى أن نوع المؤشر لم يتغير

فى سطر dynamic_cast تريدى تحويل مؤشر من النوع* A الى مؤشر من النوع B* وهذا لا يمكن الا اذا كان الستركت A polymorphic

عن طريق الكلمة virtual

فى برنامج devcpp لو حذفتى كلمة virtual

شوفى الخطأ الناتج

C:\Dev-Cpp\main.cpp cannot dynamic_cast `ap' (of type `struct A*') to type `struct B*' (source type is not polymorphic)

أى يجب أن يكون الستركت المراد تحويله أن يكون polymorphic

سلام

تم تعديل هذه المشاركة بواسطة amin_mu123 في 8 مايو 2009 في 00:14

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#4

مشكووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووووو

ور

الله يوفقك ويسعدك ويحقق كل امنياتك يامبرمجنا

تسلم اخوي لاعدمناك

"تحيه لام الدنيا"

#5

اسفه على الازعاج اخوي بس انا عدلت بالكود وحذفت الفيرتشول دستركتر وحطيت فيرتشول فانكشن اصبحت فقط البوينتر الاول من نوع كلاس B

اما البوينتر الثاني قال انه من الكلاس A

التغير هو

#include <iostream>
#include <typeinfo>
using namespace std;

struct A { 
	  virtual void f() {cout<<"AA";} 
};
struct B : A {;
//virtual ~B(){};
};
struct C { };
struct D : C { };

int main() {
  B bobj;
  A* ap = &bobj;
  A& ar = bobj;
  cout << "ap: " << typeid(ap).name() << endl;
  cout << "ar: " << typeid(&ar).name() << endl;

  D dobj;
  C* cp = &dobj;
  C& cr = dobj;
  cout << "cp: " << typeid(cp).name() << endl;
  cout << "cr: " << typeid(cr).name() << endl;
B * b2 = dynamic_cast<B*>(ap);   /* NULL */

system("pause");
return 0;
}

والمين طلع فيه الاتي

ap A

ar B//علما بانه هنا عندما اضع الرفرنس جوا القوس كذا

يقول انه تبع الكلاس A

cp C

cr C

ماهو تفسير ذلك مشكورا

#6

بارك الله فيكى

تحيتك وصلت لأم الدنيا

يجب أن تفرقى بين المؤشر نفسه وما يشير اليه المؤشر

عندما تضعى نجمه قبل اسم المؤشر فأنتى تقصدى ما يشير اليه المؤشر

ولمراعاة الدقه

المؤشر من النوع A* عندما يكون A

polymorphic فإن المؤشر يمكن أن يشير الى كائن مشتق

أما طبيعة المؤشر نفسه لم تتغير أى يمكن استخدامه ليشير الى كائن من نفس نوع الأب

والخلاصه

A* b

b هنا مؤشر مجهز ليشير الى كائن من النوع A او كائن من كلاس مشتق من A طبعا لو كان A

polymorphic

أما b* فهو الكائن المشار اليه نفسه

هل فهمتى الفرق ؟؟؟؟

تم تعديل هذه المشاركة بواسطة amin_mu123 في 8 مايو 2009 في 15:04

اللهم صل على سيدنا محمد وعلى آله وصحبه وسلم

#7

مشكور

بارك الله فيك

مواضيع مشابهة