
16-02-2009, 19:22
|
 |
|
|
חבר מתאריך: 21.12.04
הודעות: 30,020
|
|
כאשר יש לך הורשה ממחלקה אב למחלקה בן, אתה למעשה מייצר כאילו את מחלקת האב ואז מסביבה מוסיף את הנתונים שיש במחלקה הבן שהם מעבר למה שיש במחלקה האב.
דוגמא שהביאו לנו במכללה (אגב, גם לנו יש מבחן במונחה עצמים בעוד יומיים )
קוד PHP:
#include<iostream> using namespace std; #include <conio.h>
class points{ protected: double x,y; public: void set_dim(double i,double j=0) //j has default for circle { x=i; y=j; } virtual void show_area() = 0; //pure
};
class triangle: public points{ public: void show_area() { cout<<"Triangle with height "<<x<<"and base "<<y<<"\n"; cout<<"has an area of "<< x*0.5 * y <<".\n"; } };
class square: public points{ public: void show_area() { cout<<"square with dimentions "<<x<<" x "<<y<<"\n"; cout<<"has an area of "<< x * y <<".\n"; } };
class circle: public points{ public: //no definition of show_area() will cause an error void show_area() { cout << "Area is: "<<x<<" x 3.14 = " << x * 3.1415 << endl; }
};
int main() {
points *p; //create pointer to base type triangle t; //create objects of derived types square s; circle c; //illegal can't create
p=&t; p->set_dim(10.0, 5.0); p->show_area(); p = &c; p-> set_dim (5); p -> show_area(); getch(); return 0; }
אתה יכול לראות ב main שבנינו מצביע מסוג האבא, והוא מסוגל לגשת לכל האיברים במחלקות היורשות (הבנים) ששייכות לאבא (זאת אומרת שאם יש פונקציה שבנית בבן שאיננה קיימת באבא, לא תוכל לגשת אליה עם מצביע שכזה).
זה הקטע של פולימורפיזם, האיחוד של כמה שיותר פונקציות ומשתנים השייכים לכלל המחלקות שלך ואילו בבנים ליישם פונקציות ומשתנים השייכים ספציפית רק לפונקציה הספציפית הזו.
זה טוב כי אתה מגדיר רק במקום אחד את כל המשתנים פעם אחת, ואז הבנים מקבלים את זה אוטומטית. זה נחמד.
בנוסף, יש את הקטע של virtual המאפשר לך שני דברים.
ה virtual הרגיל פשוט בא להגיד "אני פונקציה נחותה", זאת אומרת שכשתתבצע הורשה, אם לבן יש פונקציה באותו השם כמו הפונקציה virtual אצל האב, אז הפונקציה של הבן תמומש בפועל ולא זו של האב (זה היה קורה בכל מקרה גם בלי ה virtual אבל אומרים שזו דרך נכונה יותר לתיכנות).
הפונקציה virtual תמומש בצורה רגילה לחלוטין אצל האב וחוץ מהעובדה שבהורשה היא 'חלשה' יותר, זו פונקציה רגילה לכל דבר.
יש גם virtual אחר המכונה pure virtual והוא יוצהר במחלקה האב, אבל לא תמומש בו. היא באתה להגיד "לכל הבנים שלי, צריכה להיות פונקציה בשם "bla bla bla". אם תיצור מחלקה שתירש מהאב ולא תממש את הפונקציה הזו, תקבל שגיאת קומליפציה. בדוגמא שהבאתי למעלה, המתרגל לא מימש את show_area של המעגל, אלא אני מימשתי בעצמי (הדוגמא שלו היתה ללא המימוש כדי להראות לנו שזה לא עובד. אני תיקנתי ומימשתי בעצמי כדי לגרום לזה כן לעבוד).
המימוש של pure virtual כפי שניתן לראות בדוגמא הוא רגיל, רק שאתה לא ממש את הפונקציה להבדיל מ virtual רגיל, ואתה כותב בסוף "שווה אפס". אפילו בלי סוגריים מסולסלים.
מקווה שהיה ברור 
|