הפונקציה מקבלת מצביע למכונית כללית. למעשה מדובר בסוג מסוים של מכונית, מכונית ספציפית, אבל changeWheel מתייחסת אליה פשוט כמכונית ומבצעת עליה רק פעולות שאפשר לעשות על כל מכונית. כאשר changeWheel תבקש ממכונית לעשות פעולה מסוימת, המכונית תבצע את הפעולה באופן ייחודי לה. ניתן לראות שהממשק למכונית מוגדר על ידי ההתייחסות המופשטת (המצביע למכונית כללית) ואילו הפעולה שתתבצע למעשה מוגדרת על ידי הטיפוס הספציפי (סוג המכונית).
כל הדברים הללו מתאימים לאופן שבו אנו משתמשים באבסטרקציה בחיי היום יום. נחשוב לדוגמה על המשפט: "בחדר ההמתנה צריך לשים מספר כיסאות בשביל שהלקוחות לא יצטרכו לחכות בעמידה". המשפט משתמש במושג המופשט "כיסא". יש המון סוגי כיסאות אבל המשפט מתייחס רק לתכונה המשותפת של כולם: כיסא מאפשר לשבת. כאשר המשפט ייושם, ייבחרו סוגים ספציפיים של כיסאות. אולי יהיו להם ארבע רגליים ואולי שלוש, אבל בכל מקרה הם יאפשרו ללקוחות להמתין בישיבה.
גם בדוגמה זו השתמשנו בהתייחסות מופשטת, התנסחנו באופן כללי שאיננו תלוי בסוג הספציפי ולבסוף ראינו איך הטענות הכלליות מקבלות משמעות ספציפית בהתאם לסוג שבו מדובר.
הפעלת אלגוריתם כללי על מבנה נתונים הטרוגני ניתנת לביצוע על ידי פולימורפיזם בזמן ריצה ולא ניתנת לביצוע על ידי פולימורפיזם בזמן הידור. לדוגמה מערך המכוניות שהופיע בדוגמה הראשונה, מכיל מכוניות מסוגים שונים, כלומר מדובר במערך הטרוגני ולא הומוגני. בדוגמת הקוד השנייה היינו יכולים להפעיל את הפונקציה הפולימורפית רק על מערך הומוגני של מכוניות.
מימוש פולימורפיזם על ידי המהדר.
נתבונן שוב בקטע הקוד המממש פולימורפיזם בזמן ריצה:
void changeWheel(Car *p) {
p-&gt;stop();
p-&gt;placeJack();
p-&gt;lift();
נשאלת השאלה כיצד מתורגם קטע זה לשפת מכונה. לדוגמה הפעלת הפונקציה stop:
p-&gt;stop();
בניגוד להפעלת פונקציה רגילה, בזמן ההידור לא ידוע איזה קוד יש להפעיל. האם מדובר ב -() Bus::stop ,ב -() PrivateCar::stop
או אולי פונקציית stop של טיפוס אחר.
התשובה לשאלה זו מתבררת רק בזמן ריצה, כאשר ידוע על איזה טיפוס ספציפי מצביע p.
הקומפיילר, אם כן, צריך לייצר קוד הקורא לפונקציה מסוימת בהתאם לטיפוס האובייקט שמוצבע על ידי p באותו הרגע. כדי לייצר קוד כזה, יש להתייחס לקוד הנמצא בכתובת משתנה. במילים אחרות יש להשתמש במושג של מצביע לפונקציה.
הקוד הבא מדגים איך אפשר לממש פולימורפיזם בשפת C, שפה שלא תומכת בפולימורפיזם באופן מובנה:
#include &lt;malloc.h&gt;
#include &lt;stdio.h&gt;
typedef void (*fun_t)(void);
typedef struct Car {
fun_t stop;
/* fun_t placeJack, lift, ... */
} Car;
Car* createCar(fun_t stopFunction) {/*fun_t placeJackFunction, fun_t liftFunction...*/
Car *p = (Car*)malloc(sizeof(Car));
p-&gt;stop = stopFunction;
/* p-&gt;placeJack = placeJackFunction; p-&gt;lift = ... */
return p;
/* void busPlaceJack() {...} void busLift() {...} ... */
/* void privatePlaceJack() {...} void privateLift() {...} ... */
void changeWheel(Car *car) {
car-&gt;stop();
/* car-&gt;placeJack(); car-&gt;lift();... */
int main() {
Car *p1 = createBus(), *p2 = createPrivate();
changeWheel(p1);
changeWheel(p2);
/* free memory .. */
return 0;
הדוגמה האחרונה פשטנית במקצת. היא מתחמקת מבעיות טכניות שונות המופיעות באובייקטים פחות מנוונים מאלה שבדוגמה. בנוסף, ניתן לראות שהשיטה המוצגת בדוגמה, בזבזנית בזיכרון. עבור "כל אובייקט" (מכונית) יש לשמור מספר מצביעים לפונקציות כמספר הפונקציות שיש למכונית. אותם מצביעים לפונקציות יכולים להוות את רוב הזיכרון הדרוש לאחסון האובייקט. בזבוז הזיכרון נובע מהעובדה, שאוסף הפונקציות עליהם מצביע האובייקט הוא מאפיין של ה - class ולא של האובייקט הספציפי. לדוגמה, לכל האובייקטים מסוג Bus יהיו בדיוק אותם ערכים בכל מצביעי הפונקציות שלהם.
בגלל העובדה שמדובר בעצם במידע של ה-class, הגיוני לצמצם את כל מצביעי הפונקציות למצביע יחיד שיפנה למקום בו נמצאת כל האינפורמציה של ה-class. האינפורמציה הזו יכולה להיות פשוט מערך של מצביעים לפונקציות - אותם מצביעים שתוארו בדוגמה והוו שדות באובייקט.
הרעיון שתואר הוא באמת השיטה המקובלת לממש פולימורפיזם של זמן ריצה. אותו מערך פונקציות נקרא virtual table ואותו שדה יחיד המצביע עליה נקרא virtual table pointer.
כפי שניתן לראות בתמונה, כל אובייקט מסוג Car או מסוג היורש מ-Car, מחזיק מצביע לטבלה ייעודית לאותו סוג. הטבלה מחזיקה מצביעים לפונקציות. הקוד
p1.placeJack()
יתורגם לקוד הדומה לקוד הבא:
p1.m_vtbl_ptr[2]()
כפי שניתן לראות, קיימת כאן הסתמכות על העובדה שהפונקציה placeJack נמצאת תמיד באותו אינדקס, בכל הטבלאות הווירטואליות (במקרה זה - 2).
מחיר פולימורפיזם הממומש על ידי virtual table.
מבחינת זיכרון, כאשר ל-Class יש לפחות פונקציה פולימורפית (וירטואלית) אחת, כל אובייקט מסוגו (ומסוג יורשיו) יכיל מצביע virtual table pointer. עבור אובייקטים גדולים הדבר עשוי להיות זניח אבל עבור אובייקטים קטנים, במיוחד אם יש מופעים רבים שלהם, הדבר עלול להיות משמעותי.
מבחינת זמן הריצה המחיר הוא מעבר אחד דרך תא של מערך הטבלה הווירטואלית. בדרך כלל הדבר מתורגם לפקודות בודדות בשפת מכונה (במקרים רבים - פקודה בודדת). לרוב, התשלום בזמן הריצה הוא זניח אבל במקרים בהם הפונקציה הווירטואלית קצרה מאוד והיא נקראת מספר רב של פעמים - המחיר עלול להיות משמעותי.
באופן כללי, השימוש בפונקציות פולימורפיות נחשב לטכניקה יעילה.
מפרץ גואנטנמו
מפרץ גואנטנמו (ספרדית: Bahía de Guantánamo) הוא טריטוריה של ארצות הברית (חלקו הדרומי של המפרץ) באי קובה. שטחה 116 קמ"ר ושוכן בה בסיס של הצי האמריקני, הבסיס האמריקני הוותיק ביותר שאינו שוכן על אדמת ארצות הברית.
היסטוריה.
קובה נכבשה על ידי ארצות הברית בסופה של מלחמת ארצות הברית–ספרד ב-1898. עם סיומה של המלחמה החילה ארצות הברית ממשל צבאי בקובה כדי להעביר את מוסדות השלטון לממשלה קובנית עצמאית ואזרחית. ב-1901 החלה ארצות הברית בהעברת השלטון לידי הקובנים ובמסגרת זו חוקקה ב-2 במרץ 1901 את תיקון פלאט המסדיר את יחסי שתי המדינות ומבטיח את זכותה החוקית של ארצות הברית להתערב בפוליטיקה הקובנית. התיקון נכפה על קובה בידי שר המלחמה האמריקאי ב-8 ביוני 1901 והתיקון לחוקת קובה אושר בידי הנציגים הקובנים ב-12 ביוני 1901.
על פי סעיף 7, הבטיח התיקון את השליטה האמריקאית בחלק מהטריטוריה הלאומית הקובנית בכך שקבע כי ארצות הברית תורשה להחזיק כוח צבאי וימי במפרץ גואנטנמו ותשלם עבורו 2,000 מטבעות זהב (כ-4,000 דולר כיום) בכל שנה. החוזה זכה להתנגדות בקרב תושבי קובה שקיבלה את עצמאותה ב-20 במאי 1902, אך חודש מספר פעמים על ידי ממשלות הבובות הקובניות.
לאחר המהפכה הקובנית ועלייתו לשלטון של פידל קסטרו, קסטרו דרש מארצות הברית לפנות את המפרץ, אך ארצות הברית ובראשה הנשיא דווייט אייזנהאואר סירבה לפנות את בסיס הצי. ארצות הברית ממשיכה לשלוט בשטח גם כיום, ומקפידה לשלוח לקובה המחאה על סך של כ-4,000 דולרים בכל שנה, כפי שהתחייבה במקור לשלם. ממשלת קובה מסרבת לפדות את ההמחאות, פרט להמחאה שנפדתה בשנת 1959, בסמוך למהפכה, לפני שמדיניות הממשלה גובשה סופית. מאז המהפכה חוזר קסטרו על טענות נגד השליטה האמריקנית במפרץ, בין היתר הוא טוען שהסכם החכירה אינו חוקי, ושלארצות הברית אין צורך אמיתי בבסיס ימי במפרץ.
בין הבסיס הצבאי לבין שטחה של קובה מפרידים שדות מוקשים מהגדולים בעולם. ארצות הברית וקובה הניחו כל אחת שדה מוקשים, אך השדה האמריקני פונה לאחר 1996 בהוראת הנשיא קלינטון.
ממשלת קובה ניתקה את אספקת החשמל והמים לבסיס, והללו מסופקים ממדינות שכנות, ג'מייקה ופוארטו ריקו. עד היום עדיין עובדים אחדים מתושבי קובה בבסיס, והם עוברים את הגבול בכל יום. עובדים אלו ותיקים, וממשלת קובה אוסרת העסקת עובדים חדשים.
בתחילת המאה ה-21 השתמשה ארצות הברית בבסיס לכליאתם של שבויי מלחמה מעיראק ומאפגניסטן, ופתחה את מתקן המעצר בגואנטנמו. בתקשורת פורסם כי תנאי המעצר של העצירים מחפירים. טענתה של ארצות הברית היא שהצבא האמריקני אינו כפוף לחוקת ארצות הברית בפעילותו מחוץ לגבולותיה.
ב-22 בינואר 2009 הוציא נשיא ארצות הברית ברק אובמה צו המורה על סגירת מתקן המעצר בגואנטנמו בתוך שנה ומסירת ההליכים המשפטיים של העצירים בידי התובע הכללי. הדבר לא נעשה והמתקן המשיך להתקיים עד תום כהונתו של אובמה כנשיא ופועל גם כיום.
משוואה ממעלה שנייה
משוואה ממעלה שנייה או משוואה ריבועית היא משוואה מהצורה formula_1 כאשר formula_2 הם מקדמים בשדה נתון (למשל, המספרים הרציונליים). מבחינה גאומטרית, מציאת הפתרון שקולה למציאת חיתוכי הפרבולה formula_3 עם הישר formula_4.
לרקע היסטורי ראו היסטוריה של פתרון משוואות פולינומיות.
נוסחת השורשים לפתרון משוואה ריבועית.
הפתרונות למשוואה הריבועית formula_5 הם formula_6.
את הפתרון מקבלים על ידי השלמה לריבוע: כפל ב-formula_7 והוספת הדיסקרימיננט formula_8 לשני האגפים, מביא את המשוואה לצורה formula_9. לאחר הוצאת שורש ריבועי מתקבלים הפתרונות formula_10. אם a קטן, אפשר לשם הדיוק הנומרי להשתמש בנוסחה formula_11, המתקבלת מהנוסחה המקורית על ידי הכפלת המונה והמכנה בצמוד. בחישוב נומרי אפשר לפתור את המשוואה באמצעות שיטת מולר.