Проблема приведения типов и скрытия методов при наследовании

C x = new B() недопустимо: экземпляр базового класса не является экземпляром производного. Кроме того, имя PrintStuff закомментировано, что отдельно ломает объявление метода.

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

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

C x = new B() недопустимо: экземпляр базового класса не является экземпляром производного. Кроме того, имя PrintStuff закомментировано, что отдельно ломает объявление метода.

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

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

Условие

В чем заключается причина, по которой данный фрагмент кода не компилируется?

class B
    {
        public void F() {Console.WriteLine("B.F");}
    }

    class C : B
    {
        public void F() { Console.Write("C.F");}

        public static void // PrintStuff()
        {
            C x = new B(); x.F();
        }
    }

Ответ

C x = new B() недопустимо: экземпляр базового класса не является экземпляром производного. Кроме того, имя PrintStuff закомментировано, что отдельно ломает объявление метода.

Исправьте заголовок на public static void PrintStuff(). Если создать C x = new C();, вызов x.F напечатает C.F. Если написать B x = new C();, будет B.F, поскольку метод базы не virtual, а метод C скрывает его.

Для явного сокрытия укажите new перед методом C.F; для настоящего полиморфизма — virtual в B и override в C. Приведение (C)new B() не решает проблему: оно компилируется, но заканчивается InvalidCastException.

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

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

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

Подробнее