Вот два простых класса, изначально у обоих нет ключевых слов (виртуальный, перегрузка, переопределение, повторное введение):
TComputer = class(TObject)
public
constructor Create(Teapot: Integer);
end;
TCellPhone = class(TComputer)
public
constructor Create(Teapot: Integer; Handle: string);
end;
Я буду представлять эти определения как несколько более короткие:
TComputer = class(TObject)
constructor Create(Teapot: Integer);
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string);
И при построении TCellPhone
существует только один конструктор (int
, string
) - потому что конструктор предка был скрыт.я укажу видимые конструкторы TCellPhone
как:
- Teapot: Integer;Дескриптор: строка
Теперь для вопроса, первые 3 случая имеют смысл, в 4-м нет:
1.Конструктор предка скрыт потомком:
TComputer = class(TObject)
constructor Create(Teapot: Integer);
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string);
Teapot: Integer; Handle: string
Это имеет смысл, конструктор предка скрыт, потому что я объявил новый конструктор.
2.Виртуальный конструктор-предок скрыт потомком:
TComputer = class(TObject)
constructor Create(Teapot: Integer); virtual;
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string);
Teapot: Integer; Handle: string
Это имеет смысл, конструктор-предок скрыт, потому что я объявил новый конструктор.
Примечание: Поскольку предок является виртуальным: Delphi предупредит вас о том, что вы скрываете виртуального предка (в предыдущем примере скрытия статического конструктора: никто не заботится, поэтомубез предупреждения).Предупреждение может быть подавлено (что означает «Да, да, да, я скрываю виртуальный конструктор. Для этого я имел в виду »), добавив reintroduce :
TComputer = class(TObject)
constructor Create(Teapot: Integer); virtual;
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string); reintroduce;
3.Конструктор предка не скрыт в потомке из-за перегрузки:
TComputer = class(TObject)
constructor Create(Teapot: Integer);
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string); overload;
Teapot: Integer; Handle: string
Teapot: Integer
Это имеет смысл, так как потомокКонструктор - это перегрузка предка, поэтому оба могут присутствовать.Конструктор предка не скрывается.
4.Конструктор виртуального предка не скрыт в потомке из-за перегрузки - , но все равно выдается предупреждение :
Это случай, который не имеет смысла:
TComputer = class(TObject)
constructor Create(Teapot: Integer); virtual;
TCellPhone = class(TComputer)
constructor Create(Teapot: Integer; Handle: string); overload;
Это имеет мало смысла.Не только предок не скрыт, потомок перегружен;это не должно даже быть жаловаться.
Что дает?