public class A

Программа напечатает BAC без разделителей. Print1 переопределён в B, Print2 у A невиртуальный, а C лишь скрывает его новым методом.

Короткий ответ

Что ответить на собеседовании

Программа напечатает BAC без разделителей. Print1 переопределён в B, Print2 у A невиртуальный, а C лишь скрывает его новым методом.

Подробный разбор

Ответ с пояснениями

Условие

public class A { public virtual void Print1() { System.Console.Write("A"); } public void Print2() { System.Console.Write("A"); } }

public class B : A { public override void Print1() { System.Console.Write("B"); } }

public class C : B { public new void Print2() { System.Console.Write("C"); } }

static void Main(string[] args) { var c = new C(); A a = c;

a.Print1();
a.Print2();
c.Print2();

}

Что будет в stdout?

Ответ

Программа напечатает BAC без разделителей. Print1 переопределён в B, Print2 у A невиртуальный, а C лишь скрывает его новым методом.

a фактически ссылается на C. Вызов a.Print1() проходит виртуальную диспетчеризацию и использует унаследованную от B реализацию, печатающую B.

Для a.Print2() используется статический тип A, поэтому выводится A. В c.Print2() статический тип C, где объявлен скрывающий метод, и выводится C. Ключевое слово new не превращает невиртуальный метод базы в override.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее