שאלה לגבי תקינות של שורות מסוימות בקוד מסוים

שאלה לגבי תקינות של שורות מסוימות בקוד מסוים

נתון הקוד הבא:
קוד:
1. #include <iostream>
2. using namespace std;
3. class X {
4. public:
5. X)int i = 0( : nx)i( {}
6. void f)( { cout << nx; }
7. int nx;
8. };
9. class Y : public X {
10. public:
11. Y)int i = 0, int j = 0( : X)i(,ny)j( {}
12. void h)( {
13. this->X::f)(;
14. cout << ny; }
15. int ny;
16. };
17. int main)( {
18. Y y1)2(;
19. y1.X::f)(;
20. X::f)(;
21. y1.f)(;
22. y1.X::h)(;
23. }

קודם כל , ברור לי מדוע שורה 22 לא מתקמפלת.

לא ברור לי מדוע שורות 13 ו-19 מתקמפלות, אבל שורה 20 לא מתקמפלת.
 

BravoMan

Active member
אתה יודע, קומפיילרים אוהבים לספר למתכנתים

(גם כאלה שרק רוצים להיות מתכנתים) למה דברים לא מתקמפלים

&nbsp
תסתכל על שורה 20: מנסים לקרוא לפונקציה f ללא אובייקט, כאילו היית פונקציה סטטית.
אבל היא לא!
&nbsp
בשורה 13 ו-19 קוראים לאותה פונקציה עם אובייקט.
ב-13 זה ה-this, האובייקט עצמו שבתוכו נמצאים, וב-19 זה האובייקט שבמשתנה y1.
&nbsp
אז למה שתהיה בעיה?
 

BravoMan

Active member
אתה צריך לפרק את השורה ולהבין מה היא אומרת:

X::f הוא השם המלא של הפונקציה שאותה רוצים להפעיל.
&nbsp
בגלל שהשם המלא כולל את שם המחלקה שבה מוגדרת הפונקציה, הקומפיילר יודע שמנסים להפעיל מפורשות את הפונקציה f כפי שהיא מוגדרת במחלקה X גם אם האובייקט הנתון הוא לא X, אלא טיפוס שיורש מ-X, כגון Y.
&nbsp
אם Y היה דורס פונקציה f עם גרסה משלו, הדרך הזו היית עוקפת את הדריסה ומגיעה לגרסה המקורית.
&nbsp
אז החלק מימין לחץ הוא פשוט שם מפורש של פונקציה, החלק משמאל לחץ הוא האובייקט שעליו רוצים להפעיל את הפונקציה, והסיבה שמשתמשים בחץ ולא בנקודה היא שב-++C המילה this היא מצביע לאובייקט ולא האובייקט עצמו.
&nbsp
(בניגוד ל-Java שם הכל תמיד רפרנס ומשתמשים ב-this כמו במשתנה רגיל)
 
למעלה