ABA


"חידה1 - נראה מי יודע אם שדות וירטואלויות ב-++C"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15325 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15325
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   01:12   27.05.09   
אל הפורום  
  חידה1 - נראה מי יודע אם שדות וירטואלויות ב-++C  
 
ניתן להצהיר כשדות Private.
אם כן - מה ההגיון שעומד מאחורי זה?
ומה קורה ב-JAVA? וב-#C?

חידה2 - אתה תשמעו הרבה פעמים בפורומים של תכנות שב-++C תמיד מומלץ להגדיר את הדיסטרקטורים כפונקציות וירטואליות.
מה ההגיון העומד מאחורי זה?

חידה3 - נניח כי B יורש מ-A ואתם יוצרים instance בצורה הבאה:

 B* b = new A(); 

נניח כי גם ל-A וגם ל-B יש את המתודה ()f (המתודה של A נדרסת ב-B), איזו פונקציה תקרא כשנרשום ;()b.f?
ואם f וירטואלית (גם ב-A וגם ב-B), איזו תקרא?


בבקשה תענו פה רק מה דעתכם ולא על סמך בדיקה (או לפחות אם בדקתם אל תרשמו פה) בשביל לתת צ'אנס לאחרים.



בברכה,
עידן


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  לא הבנתי את הניסוח של השאלה הראשונה Net_Boy  27.05.09 03:33 1
     הכוונה שתרשום: ldan192  27.05.09 11:37 2
  תשובות 2,3... בקשר ל1 לא כ''כ הבנתי... By-king 27.05.09 17:39 3
     אני לאו דווקא דיברתי על ++C ב-3 אז זו שפה ldan192  27.05.09 17:48 4
         אז ככה... By-king 27.05.09 18:23 5
             בנוגע ל-2, השאלה מה התירוץ לזה. ו-3, לא נכון :) לפחות לא ב-++C ldan192  28.05.09 12:54 6
                 בעע התכוונתי הפוך... שוב אני יכתוב ^^ בלבלת אותי By-king 28.05.09 15:09 7
                     השאלה היא מה התירוצים לכל דבר, לא מה קורה בפועל. ldan192  28.05.09 22:31 8
                         אממ בנוגע ל2 (וגם ל3..) By-king 29.05.09 02:59 9
  מכתב DLN 30.05.09 23:47 10
     יש הבדל בין השפות... ldan192  31.05.09 16:46 11
         ...? DLN 31.05.09 22:42 12
             אה יש מצב הפכתי את התשובה שלי... אין לי כוח לחשוב על זה אפילו DLN 31.05.09 22:43 13

       
Net_Boy  לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.4.02
17151 הודעות, 1 פידבק, 2 נקודות
   03:33   27.05.09   
אל הפורום  
  1. לא הבנתי את הניסוח של השאלה הראשונה  
בתגובה להודעה מספר 0
 
   ולגבי השאר , אני יודע את התשובות אבל ניתן צ'אנס לאחרים


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   11:37   27.05.09   
אל הפורום  
  2. הכוונה שתרשום:  
בתגובה להודעה מספר 1
 

private:
virtual void f();

כדוגמא.
האם זה עובד ב-++C? אם כן - מה ההגיון מאחורי זה? C#? JAVA?
אני אסביר את עצמי כשאתן תשובה לשאלות.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
By-king לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
31427 הודעות, 1 פידבק, 2 נקודות
   17:39   27.05.09   
אל הפורום  
  3. תשובות 2,3... בקשר ל1 לא כ''כ הבנתי...  
בתגובה להודעה מספר 0
 
   ערכתי לאחרונה בתאריך 27.05.09 בשעה 17:47 בברכה, By-king
 
2. זה כי אם תיצור ככה:

A* a = new B();

(כאשר B יורש מA כמובן..) ולאחר מכן תעשה

delete a;

יופעל הדיסטרקטור של a ולא של b...

עריכה: תשובה נכונה ל3:
קראתי את זה הפוך וזה היה מוזר.. טוב בקיצור הויטואל יפעיל את הפונקציה ה"נכונה" ובלי וירטואל הפונקציה ה"לא נכונה" תופעל...


אה וד"א ב3 אתה צריך לעשות
b->f() לא? כי זה דיי פויינטר...

את 1 אני חושב שעכשיו הבנתי...
בשביל לא אפשר שימוש בפונקציה אם היא הייתה Public במחלקת בסיס... אבל אנלא בטוח בזה אז אל תתפוס אותי במילה..


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   17:48   27.05.09   
אל הפורום  
  4. אני לאו דווקא דיברתי על ++C ב-3 אז זו שפה  
בתגובה להודעה מספר 3
 
דיי אבסטרקטית.

וב-2 לא הבנת אותי. ()f היא לא דיסטרקטור, היא סתם מתודה רגילה.
השאלה אם תופעל זו של A או זו של B.
וחשוב לציין באיזו שפה מדובר כי מן הסתם יש שוני בין השפות.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
By-king לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
31427 הודעות, 1 פידבק, 2 נקודות
   18:23   27.05.09   
אל הפורום  
  5. אז ככה...  
בתגובה להודעה מספר 4
 
   ב2 דיברת על הדיסטרקטורים... אני מניח שידברת על 3..
ב3 עניתי...
אם הפונקציה f אינה וירטואלית תופעל הפונקציה f של A..
אם היא כן וירטואלית תופעל הפונקציה f של B... (הפונקציה הנכונה..)
אני מדבר על C++


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   12:54   28.05.09   
אל הפורום  
  6. בנוגע ל-2, השאלה מה התירוץ לזה. ו-3, לא נכון :) לפחות לא ב-++C  
בתגובה להודעה מספר 5
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
By-king לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
31427 הודעות, 1 פידבק, 2 נקודות
   15:09   28.05.09   
אל הפורום  
  7. בעע התכוונתי הפוך... שוב אני יכתוב ^^ בלבלת אותי  
בתגובה להודעה מספר 6
 
   ערכתי לאחרונה בתאריך 28.05.09 בשעה 15:13 בברכה, By-king
 
עם כל השמות

class Base
{
public:
void f()
{
cout<<"Base"<<endl;
}
};

class A : public Base
{
public:
void f()
{
cout<<"not base"<<endl;
}
};


עכשיו אם נעשה

Base* b = new A();

ועכשיו נעשה:
b->f()
יודפס
base
אם f הייתה וירטואלית
היה מודפס
not base


=======
עכשיו בקשר ל2..
התירוץ הוא שהדיסטרקטור של המחלקה היורשת לא יופעל...
מה שאומר שאם היינו עושים בשאלה הקודמת אחרי זה
delete b;
היה מופעל הדיסטרקטור של base (כל עוד הוא לא וירטואלי..)
עכשיו מה שאני כמעט בטוח בו (אבל לא ב100%) זה שאם היה ל A שיורשת מBase עוד data members הם לא היו נמחקים אם הדיסטרקטור לא היה וירטואלי...
מה שאני בטוח ב100% בו זה שנגיד והיינו מבצעים משהו בדיסטרקטור של A אז הוא לא היה מתבצע... והדיסטרקטור לא וירטואלי..)

ב1 צדקתי אבל?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:31   28.05.09   
אל הפורום  
  8. השאלה היא מה התירוצים לכל דבר, לא מה קורה בפועל.  
בתגובה להודעה מספר 7
 
ובנוגע ל-1 שרשמת.. לא נכון תנסה ותראה.
ובנוגע לשני, שוב, לא מה שקורה בפועל אלא מה הסיבה לכך.
יש תירוצים לכל דבר


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
By-king לחץ כאן להצגת דירוג המשתמש
חבר מתאריך 1.8.02
31427 הודעות, 1 פידבק, 2 נקודות
   02:59   29.05.09   
אל הפורום  
  9. אממ בנוגע ל2 (וגם ל3..)  
בתגובה להודעה מספר 8
 
   אם לא עושים דיסטקטור וירטואלי לא נעשה שימוש ב vfptr (משהו כזה לא זוכר את שמו המדוייק כבר..)
מה שאומר שכאשר תעשה delete אתה תלך לדיסטרקטור של הסוג... שזה BASE*... מה שאומר שהוא יפעיל את הדיסטרקטור של base... אם זה היה וירטואלי אז היית ניגש ל vfptr לפני כן ושם היה קישור נכון לדיסטרקטור של A
אני מקווה שזה מה שהתכוונת בנוגע ל"תירוץ" אם לא אז אני כבר לא יודע מה אתה מחפש ^^


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות, דרג אמינות חבר זה
   23:47   30.05.09   
אל הפורום  
  10. מכתב  
בתגובה להודעה מספר 0
 
   ממ אין לי כוח לחשוב על 1
2 - זה יכול ליצור לך כל מיני דליפות זכרון חביבות אם אתה לא מגדיר את הדסטקרטור כוירטואלי וקופץ איזה אקספשן בזמן הקונסטרקטור
3 - אם זה לא וירטואלי, A יקרא, אם זה וירטואלי בB אז B יקרא.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   16:46   31.05.09   
אל הפורום  
  11. יש הבדל בין השפות...  
בתגובה להודעה מספר 10
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות, דרג אמינות חבר זה
   22:42   31.05.09   
אל הפורום  
  12. ...?  
בתגובה להודעה מספר 11
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
DLN
חבר מתאריך 20.4.07
15884 הודעות, דרג אמינות חבר זה
   22:43   31.05.09   
אל הפורום  
  13. אה יש מצב הפכתי את התשובה שלי... אין לי כוח לחשוב על זה אפילו  
בתגובה להודעה מספר 12
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net