B יורשת מ-A ודורסת f ו-g. A.g קוראת ל-f() על this (קריאה וירטואלית — מתפזרת לגרסה של B בזמן ריצה, לפי הטיפוס האמיתי, לא המוצהר). B.superG עוקפת את הדריסה במפורש עם super.g() וקוראת דווקא לגרסת A של g — אבל בתוכה, ה-f() הפנימית עדיין וירטואלית ומתפזרת ל-B.f.
B יורשת מ-A ודורסת f ו-g. A.g קוראת ל-f() על this (קריאה וירטואלית — מתפזרת לגרסה של B בזמן ריצה, לפי הטיפוס האמיתי, לא המוצהר). B.superG עוקפת את הדריסה במפורש עם super.g() וקוראת דווקא לגרסת A של g — אבל בתוכה, ה-f() הפנימית עדיין וירטואלית ומתפזרת ל-B.f.
class A{
public virtual void F() {
Console.WriteLine("A.F");
}
public virtual void G() {
F();
}
}
public class B : A{
public override void F(){
Console.WriteLine("B.F");
}
public override void G() {
Console.WriteLine("B.G");
}
public void SuperG() {
base.G();
}
}
סעיף א
נתון קטע הקוד הבא: A a = new A(); B b = new B(); A ab = new B(); a.F(); ab.F(); b.F(); a.G(); ab.G(); b.G(); ((B)(ab)).SuperG(); b.SuperG(); עקבו אחרי ביצוע קטע הקוד ורשמו מה יהיה הפלט.
סעיף ב
האם אפשר להוסיף לקטע הקוד את שתי הפקודות הבאות? a.SuperG(); ((B)a).SuperG(); הסבירו את תשובתכם.
שאלות ותגובות על השאלה
🎓 לא הבנתם משהו? קבלו הסבר נוסף ממרצה לתכנות
שאלו כאן — ותקבלו מענה מוסמך.