Теперь (в рамках того же приложения) построим два новых класса.
class X
{
}
class Y:X
{
}
// Это уже в Main()
Y y = new Y();
Вся работа по созданию объекта-представителя класса Y при явном отсутствии конструкторов по умолчанию возлагается на КОНСТРУКТОРЫ УМОЛЧАНИЯ – те самые, которые самостоятельно строит транслятор. Особых проблем не будет, если в производном классе явным образом начать объявлять конструкторы.
class X
{
}
class Y:X
public Y(int key){}
public Y(){}
}
// Это уже в Main()
Y y0 = new Y();
Y y1 = new Y(125);
Отныне в производном классе нет больше конструктора умолчания. Теперь всё зависит от соответствия оператора определения объекта построенному нами конструктору. Объявим в производном классе оба варианта конструкторов. И опять всё хорошо. Конструктор умолчания базового класса (тот, который строится транслятором) продолжает исправно выполнять свою работу.
Проблемы возникнут, если в базовом классе попытаться объявить вариант конструктора с параметрами:
class X
{
public X(int key){}
}
class Y:X
public Y(int key){} // Нет конструктора умолчания базового класса!
public Y(){} // Нет конструктора умолчания базового класса!
}
// Это уже в Main()
Y y0 = new Y();
Y y1 = new Y(125);
И здесь транслятор начнёт обижаться на конструкторы производного класса, требуя ЯВНОГО объявления конструктора базового класса БЕЗ параметров. Если вспомнить, что при ЛЮБОМ вмешательстве в дело построения конструкторов транслятор снимает с себя всю ответственность, причина негодования транслятора становится очевидной. Возможны два варианта решения проблемы:
§ явным образом заставить работать новый конструктор базового класса,
§ самостоятельно объявить новый вариант конструктора без параметров.