עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++. Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing.

Slides:



Advertisements
Similar presentations
Completeness and Expressiveness. תזכורת למערכת ההוכחה של לוגיקה מסדר ראשון : אקסיומות 1. ) ) (( 2. )) ) (( )) ( ) ((( 3. ))) F( F( ( 4. ) v) ( ) v ((
Advertisements

Object Oriented 33 MCSD DORON AMIR
ממיבחניםC שאלות ++.
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
מבוא למדעי המחשב לתעשייה וניהול
בתרגול הקודם הורשה: –ניתן להרחיב רק מחלקה אחת –כל מה שלא private – עובר בהורשה –המילה השמורה super –יצירת היררכיה –Object היא שורש ההיררכיה –דריסה אופרטור.
1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
CPA: C++ Polymorphism Copyright © 2007 Mohamed Iqbal Pallipurath Overview of C++ Polymorphism Two main kinds of types in C++: native and user-defined –User-defined.
1 תוכנה 1 תרגול 14 – סיכום. 2 קצת על מנשקים מנשק יכול להרחיב יותר ממנשק אחד שירותים במנשק הם תמיד מופשטים וציבוריים public interface MyInterface { public.
טבלאות סמלים נכתב ע"י אלכס קוגן סמסטר חורף, תשס"ח.
Pointers הרצאה קריטית. השאלות הפתוחות מה זה ה- & שמופיע ב scanf מדוע כשמעבירים מחרוזת ל scanf אין צורך ב & האם ניתן להכריז על מערך שגדלו אינו ידוע בתחילת.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
רקורסיות נושאי השיעור פתרון משוואות רקורסיביות שיטת ההצבה
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
עבודה סמינריונית Prelude to Ukkonen algorithm ON-LINE CONSTRUCTION OF SUFFIX TREES מגישים : עיד מוחמד טיבי פיראס.
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
Map-Reduce Input: a collection of scientific articles on different topics, each marked with a field of science –Mathematics, Computer Science, Biology,
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
בהסתברות לפחות למצא בעיה במודל PAC עבור בהסתברות ε הפונקציה f טועה מודל ONLINE 1. אחרי כל טעות הפונקציה משתפרת 2. מספר הטעיות קטן.
תרגול חזרה. מבנה האובייקט תאר את מבנה האובייקט כולל מבנה טבלאות הפונקציות הוירטואליות עבור התכנית הבאה struct A { int x; virtual void a() {}; }; struct.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
א " ב, מילים, ושפות הפקולטה למדעי המחשב אוטומטים ושפות פורמליות ( ) תרגיל מספר 1.
מודל הלמידה מדוגמאות Learning from Examples קלט: אוסף של דוגמאות פלט: קונסיסטנטי עם פונקציה f ב- C ז"א קונסיסטנטי עם S ז"א מודל הלמידה מדוגמאות Learning.
עקרון ההכלה וההדחה.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
Last time on Clang משתנה: "פתק" המשמש את המחשב לשמירת מידע. לכל משתנה יש שם וטיפוס כללים לשמות משתנים –חייבים להכיל רק אותיות, מספרים ו '_' –חייבים להתחיל.
תוכנה 1 - תרגול שיעור 10 Pointers (2) שולי לב יהודי
מודל הלמידה מדוגמאות Learning from Examples קלט: אוסף של דוגמאות פלט: קונסיסטנטי עם פונקציה f ב- C ז"א קונסיסטנטי עם S ז"א.
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
Safari On-line books. מה זה ספארי ספארי זו ספריה וירטואלית בנושא מחשבים היא כוללת יותר מ כותרים כל הספרים הם בטקסט מלא ניתן לחפש ספר בנושא מסוים.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
Sscanf example #include int main () { char sentence []="Rudolph is 12 years old"; char str [20]; int i; sscanf (sentence,"%s %*s %d",str,&i); printf ("%s.
1 מבוא למדעי המחשב רקורסיה. 2 רקורסיה היא שיטה לפתרון בעיות המבוססת על העיקרון העומד ביסוד אינדוקציה מתמטית: אם ידועה הדרך לפתור בעיה עבור המקרים הבסיסיים.
אתחול עצמים. אתחולים ובנאים יצירת מופע חדש של עצם כוללת: הקצאת זכרון, אתחול, הפעלת בנאים והשמה לשדות במסגרת ריצת הבנאי נקראים גם הבנאי/ם של מחלקת הבסיס.
Garbage Collection CSCI 201L Jeffrey Miller, Ph.D. HTTP :// WWW - SCF. USC. EDU /~ CSCI 201 USC CSCI 201L.
OOPs Object oriented programming. Based on ADT principles  Representation of type and operations in a single unit  Available for other units to create.
Object Oriented Programming: Java Edition By: Samuel Robinson.
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Practice session 3 תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי ) שיטות חישוב : Applicative & Normal Evaluation Partial Evaluation.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים עוברים לג ' אווה.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
Practice session 3.  תחביר ממשי ( קונקרטי ) ותחביר מופשט ( אבסטרקטי )  שיטות חישוב : Applicative & Normal Evaluation.
OOPs Object oriented programming. Abstract data types  Representationof type and operations in a single unit  Available for other units to create variables.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים פולימורפיזם מתקדם ממשקים בג ' אווה 1.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
Bridge Bridge is used when we need to decouple an abstraction from its implementation so that the two can vary independently. This type of design pattern.
עקרונות תכנות מונחה עצמים תרגול 10: Generics. Outline  Generic classes  Generics & Inheritance  Wild Cards  Case study: Generic Graph.
Object Oriented Programming in C++ Chapter 7 Dynamic Binding.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 נתבונן בפונקציה הבאה public static int min(int[] a,int n) { int min = a[0]; for (int i = 1; (i < n ) && (i < a.length) ; i++) if (min > a[i]) min = a[i];
האוניברסיטה העברית בירושלים
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
OOP Tirgul 12.
Object Oriented Programming
Object Oriented Programming
Operators Overloading
Object Oriented Programming
מחלקות classes.
מצביעים קרן כליף.
תירגול 14: מבני נתונים דינאמיים
C++ Functions, Classes, and Templates
ממשקים - interfaces איך לאפשר "הורשה מרובה".
Marina Kogan Sadetsky –
בניית מחסנית סטטית Static Stack Implementation מורים מובילים תשע"ה
תוכנה 1 תרגול 13 – סיכום.
Overview of C++ Polymorphism
Presentation transcript:

עקרונות תכנות מונחה עצמים תרגול 11: OOP in C++

Outline  Where do the objects live ?  Inheritance  Slicing  Overriding vs Shadowing

History

Memory segmant  לכל תוכנית שרצה במחשב ( בין אם נכתבה בג ' אווה, ב ++C, או בכל שפה אחרת ) מוקצה מרחב זכרון עבור קוד התוכנית והמידע שלה.  עבור משתני התכנית מוקצים שני מקטעים עיקריים – Stack & Heap  כל אחד משני המקטעים שומר את המשתנים בדרך שונה ובעל ייעוד משלו

The Stack  המחסנית משמשת לאחסון משתנים מקומיים ופרמטרים של פונקציה.  לכל פונקציה נפתח פריים משלה במחסנית, בו נשמר כל המידע המקומי שלה.  בחזרה מהפונקציה, הפריים שלה במחסנית נסגר ( וכל המידע המקומי נעלם ) וחוזרים לפריים של הפונקציה שקראה לה ( שנמצא מתחת במחסנית )

The Heap  משמש לאחסון משתנים גם מעבר לסקופ של פונקציה בודדת.  משמש להקצאה דינאמית של משתנים.  בניגוד למחסנית, ב heap המשתנים לא מסודרים בהכרח ברצף, על פי סדר הקצאתם.

 בג ' אווה כל המשתנים הפרימיטבים (int,double,char..) מוקצים על המחסנית, וכל האובייקטים מוקצים על ה heap ( כאשר במחסנית נשמר ' מצביע ' לכתובת שלהם ב heap)  ב ++C, יש למתכנת יותר גמישות – גם משתנים פרימטיבים, וגם אובייקטים אפשר להקצות בכל אחד משני האזורים. Where do the objects live?

 Java public class Point{ protected int _x; protected int _y; public Point( int x, int y){ this._x = x; this._y = y; } Where do the objects live? public class Point3D extends Point{ private int _z; public Point3D( int x, int y, int z){ super(x,y); this_z = z; }

 C++ class Point{ protected: int _x; int _y; public: Point( int x, int y): _x(x), _y(Y){ } }; Where do the objects live? class Point3D : public Point{ private: int _z; public: Point3D( int x, int y, int z): Point(x,y){ this->_z = z; } };

Variables in Java  JAVA: public static void main(String[] args){ int x = 5; double y; char c = ‘A’; Point p1= new Point(1,1); Point3D p2= new Point3D(2,2,2); Point p3= new Point3D(1,2,3); }

Java variables 0x ‘A’ 0x1000 0x2000 0x3000 x y c p1 p2 p x1000 0x2000 0x3000

Variables in C++  C++: void main(){ int x = 5; double y; char c(‘A’); Point *p1 = new Point(1,1); Point3D p2 (2,2,2); Point *p3 = new Point3D(1,2,3); }

C++ variables 5 ? ‘A’ 0x1000 0x3000 x y c p1 p2 p x1000 0x

Memory management  משתנים המוקצים על המחסנית, נמחקים ממנה ביציאה מהפונקציה בהם הוקצו.  משתנים המוקצים על ה Heap יש למחוק במפורש.  בג ' אווה זה מתבצע על ידי ה Garbage Collector  ב ++C זה באחריות המתכנת : void main(){ Point *p1 = new Point(1,1); Point3D p2 (2,2,2); Point *p3 = new Point3D(1,2,3); delete p1; delete p3; }

Slicing  ראינו שבשתי השפות, אפשר לבצע את הפעולות הבאות : Point3D p3d = new Point3D(1,2,3); Point p = p3d ;  זה מתאפשר כיוון שלא משנה אם האובייקט ב heap הוא Point או Point3D, מה שנמצא על המחסנית זה רק הכתובת שלו, וכיוון שכל הכתובות באותו גודל, אין בעיה שב p תהיה כתובת של Point3D.  אבל מה יקרה בקטע הבא ( שאפשרי רק ב ++C): Point3D p3d(1,2,3); Point p = p3d;

Slicing Point3D p3d(1,2,3); Point p = p3d; _x _y _z p3d 2 1 _x _y p

Inheritance in C++  ב ++C לא קיים עץ ירושה יחיד ( אין אובייקט Object שכולם יורשים ממנו ), אלא מספר עצי ירושה.  אפשר לרשת יותר ממחלקה אחת  ב ++C אין ממשקים (interfaces)  יש מחלקות אבסטרקטיות, אבל לא קיימת המילה השמורה abstract  מחלקה נחשבת ' אבסטרקטית ' אם קיימת בה לפחות פונקציה אבסטרקטית אחת  כדי שיהיה ניתן לדרוס פונקציה יש לציין זאת במפורש ( על ידי המילה השמורה virtual)  כדי לציין שפונקציה היא אבסטרקטית יש לציין תחילה שהיא וירטואלית, ובנוסף להוסיף את האופרטור 0= בסוף החתימה שלה

Virtual method class Point{ protected: int _x; int _y; public: Point( int x, int y): _x(x), _y(Y){ } virtual void print(); void moveToOrigin(); }; #include “Point.h” #include Using namespace std; void Point:: print(){ cout _x _y<<endl; } void Point::moveToOrigin(){ this->_x = 0 ; this->_y = 0 ; } /* */ /* Point.h */ /* */ /* Point.cpp*/

class Point3D: public Point{ private: int _z; public: Point3D( int x, int y,int z); virtual void print(); void moveToOrigin(); }; … Point3D:: Point3d(int x, int y, int z): Point(x,y){ this->_z = z; } void Point3D:: print(){ cout _x _y; cout _z <<endl; } void Point3D::moveToOrigin(){ this->_x = 0 ; this->_y = 0 ; this->_z = 0; } /* */ /* Point3D.h */ /* */ /* Point3D.cpp*/ Virtual method

Late/Early Binding void main(){ Point *p2 = new Point3D(1,2,3); Point3D *p3 = new Point3D(4,5,6); p2->moveToOrigin(); P3->moveToOrigin(); p2->print(); p3->print(); delete p2; delete p3; } // call to Point:: moveToOrigin() // call to Point3D :: moveToOrigin() // call to Point3D :: print() Output: 0, 0, 3 0, 0, 0

Abstract class class Animal { protected: std::string name; int age; public: void printName(); virtual std::string say() =0; };

Multiple inheritance #include “animal.h” #include “drawing.h” class Snake : public Animal, public Drawing{ … }; Since there are no interfaces in C++, multiple inheritance is important and useful for big systems, especially when using design patterns

 Ambiguities: class A { virtual void f(); } ; class B { virtual void f(); } ; class C : public A, public B { void f(); };  Solution : Each base class can be uniquely identified by using the scope resolution operator ::. C *c = new C(); c->A::f(); c->B::f(); Multiple inheritance- Pitfalls

Ninja Turtle NinjaTurtle Object The Diamond Problem: Solution : virtual inheritance class Turtle : virtual public Object class Ninja: virtual public Object

Summary  Where do the objects live  Java – primitive on the stack, objects on the heap  C++ - Wherever you decide  Slicing  When polymorphism meets the stack  Inheritance  C++ has no interfaces  No one single inheritance tree  Can override only virtual function (or you will get shadowing)  Multiple inheritance  Doesn’t exist in Java, very useful in C++  Programmer should avoid ambiguities and diamond inheritance