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.