באג או פ'יצר ??

OLveD

New member
באג או פ'יצר ??

class a {...}; class b: public a {...}; class Base { public: /* ... */ virtual a &func1() = 0; }; class Derived: public Base { b b_instance; public: /* ... */ virtual b &func1() { return b_instance; } }; האם הקוד חוקי ? לפי דעתי הקוד עונה על החוקים של פונקציה ווירטואלית הקוד מתקמפל בדוט נט, אבל לא מתקמפל ב VS6 האם הקוד תומך ANSI C++ ?
 

annefan

New member
כשאתה לא בטוח במצב כזה

לך ל-Comeau Online, ותבדוק. (והתשובה היא שכן). וכשיש ויכוח ביו VS.NET ל-VC6, בנושאי סטנדרט, אין ויכוח.
 

OLveD

New member
אני אסביר

יש לך אובייקט אב (Base) שיש לו פונקציה ווירטואלית המחזירה reference ל-a יש לך אובייקט בן (Derived) אשר מיישם את הפונקציה הווירטואלית אבל מחזיר reference ל-b (שנורש מ-a). עכשיו לפי החוקים של פונקציות ווירטואליות, המימוש של הפונקציה באובייקט הבן חייב לשמור על אותו prototype (כולל ערכי החזרה) אחרת הפונקציה הווירטואלית תידרס. נשאלת השאלה, האם שמרנו על החוק הנ"ל ? (הרי ש-b הוא אכן a).
 

selalerer

New member
אההה, אני בכלל לא הבנתי את העניין ע

ד עכשיו
 

vinney

Well-known member
ערכי החזרה לא משנים

שתי פונקציות עם אותה רשימת פרמטרים ואותו שם, וערכי החזרה שונים, מגדירים אותו דבר מבחינת קומפיילר, לכן זה לא באג ולא פיצ'ר. זה פשוט בסדר, כי כשמחזירים מחלקה וירטואלית, זה די לא משנה אם זה a או b, זה ממילא נבדק מחדש כל פעם בזמן הריצה.
 

OLveD

New member
לא ממש...

אם מה שאתה אומר זה נכון, אז אין בעיה שפונקציה ווירטואלית תחזיר פעם int ופעם char. תבדוק שוב ותגיד לי אם אתה צודק...
 

vinney

Well-known member
ברור שלא

גם לא וירטואלית אתה לא יכול לעשות override רק לפי ערך ההחזרה. הקטע הוא שכשאתה מחזיר מחלקה וירטואלית b במקום מחלקה וירטואלית a שb מורשת ממנה, אין פה סתירה - אתה יוצר אותו קוד. למשל:
class a{ public: a(){}; ~a(){}; virtual int foo(void)=0; virtual a& foo2(void)=0; }; class b:public a{ public: b(){}; ~b(){}; char foo(void){return 'b'}; // wrong b& foo2(void){return *this;}; }; int _tmain(int argc, _TCHAR* argv[]) { b _b; return 0; }​
הקוד בלי foo התקמפל אצלי בVS.NET בלי בעיה, ועם - לא, וזה הגיוני, כי char וint זה שני דברים שונים, וa וb - אותו דבר, מה שמשתה זה הvtable, וזה לא משנה לערך המוחזר מפונקציה.
 
למעלה