1 / 11

תכנות מונחה עצמים והנדסת תוכנה – תשע"ד

תכנות מונחה עצמים והנדסת תוכנה – תשע"ד. RTTI ( Run Time Type Identification ). 1. מבוא. מצביע למחלקה מורישה יכול להתייחס לעצמים ממחלקות שונות (עצמים ממחלקות יורשות). מנגנון RTTI מאפשר זיהוי של סוג העצם בזמן ריצה (למשל מאפשר לדעת את סוג העצם שהמצביע מתייחס אליו באותה העת).

Download Presentation

תכנות מונחה עצמים והנדסת תוכנה – תשע"ד

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. תכנות מונחה עצמים והנדסת תוכנה – תשע"ד RTTI (Run Time Type Identification ) 1

  2. מבוא מצביע למחלקה מורישה יכול להתייחס לעצמים ממחלקות שונות (עצמים ממחלקות יורשות). מנגנון RTTI מאפשר זיהוי של סוג העצם בזמן ריצה (למשל מאפשר לדעת את סוג העצם שהמצביע מתייחס אליו באותה העת). המנגנון מוסיף תקורה לזמן הריצה ואינו נחשב לקוד נקי מבחינת תכנות מונחה עצמים. נעדיף להשתמש בפולימורפיזם מלבד מקרים בהם הכרחי או פשוט יותר להשתמש במנגנון זה. מימוש המנגנון ע"י האופרטורים: dynamic_cast typeid 2 2

  3. המרות • up casting: טבעית ואינה דורשת המרה מפורשת. B b; A a = b; // B to A is OK A* aPtr = new B; // (B*) to (A*) is OK A B

  4. המרות (המשך) • down casting: אינה טבעית, לעיתים אינה תקינה, לשם כך צריך המרה מפורשת. A a; B b = a; // error B b = (B)a; // error B* bPtr = new A; // error B* bPtr = (B*) new A; // will compile, but is bad

  5. הצורך בזיהוי הטיפוס בזמן ריצה • נניח שנרצה להפעיל פונקציה ספציפית על אחד התאים במבנה נתונים כללי: A* array[7]; array[0] = new A; array[1] = new B; : ( (B*)array[6] )->bFunction(); // is this safe???

  6. האופרטור Dynamic_cast • ניתן לבצע down cast על ידי השימוש באופרטור dynamic_cast: B* bPtr = dynamic_cast<B*>(array[6]); if (bPtr) // bPtr->bFunction(); else // handle this error : • דוגמאות נוספות

  7. האופרטור Dynamic_cast - הערות • שימוש באופרטור מחייב את העצמים להיות פולימורפים (כלומר עצמים השיכים למחלקה עם לפחות פונקציה וירטואלית אחת). • המנגנון מתאפשר בזכות ה-virtual table. • האם ניתן לשכתב את הדוגמא האחרונה ולהשתמש בפולימורפיזם במקום במנגנון זה? • בדרך כלל נעדיף להשתמש בפולימורפיזם. • נאלץ להשתמש במנגנון זה במקרים הבאים: • עבור מחלקות מוכנות שאינן ניתנות לשינוי. • עבור הפעלה של פונקציה מאוד ספציפית שלא כדאי עבורה להרחיב את הממשק של המחלקה הכללית. • אפשר להשתמש באופרטור גם עבור הפניות (ולא רק עבור מצביעים).

  8. האופרטור typeid • מאפשר לדעת מהו טיפוס העצם עליו מצביעים באותה העת. • האופרטור מחזיר עצם ממחלקה type_info. • המחלקה type_info מכילה את הפונקציה: const char* name() const • ערך ההחזרה (המחרוזת) תלוי קומפיילר. • ניתן להשוות בין עצמים של type_info בעזרת אופרטורים של השוואה (==, =!,).

  9. האופרטור typeid - דוגמא #include<typeinfo> : class A { public: virtual void f() {} }; class B : public A { public: void print() {cout << “specific function of B” << endl;} }; class C : public B {};

  10. האופרטור typeid – דוגמא (המשך) void f( A* p ) { cout << typeid(p).name() << “ “ << typeid(*p).name() << endl; if (typeid(*p) == typeid(B)) ((B*)p)->print(); } int main() { A a; B b; C c; f(&a); // class A* class A f(&b); // class A* class B specific function of B f(&c); // class A* class C }

  11. האופרטור typeid (המשך) • האופרטור מתאים במיוחד עבור מטרות debugging. • האופרטור פועל על עצמים פולימורפיים (מחלקות המכילות פונקציות וירטואליות). • מתקמפל גם לעצמים שאינם פולימורפיים אך עלול לפעול בצורה שגויה. • האופרטור פועל גם על הפניה.

More Related