Насколько я знаю, здесь есть две отдельные проблемы:
Убедитесь, что конструктор дочернего класса вызывает конструктор базового класса
Вам придется явно вызвать конструктор базового класса:
constructor TMinMatrix.Create(Rows, Cols: Byte);
begin
inherited;
//...
end;
Убедиться, что конструктор дочернего класса переопределяет конструктор базового класса
Вы также также должны будете создать дочерний класс 'constructor override
и базовый класс' constructor virtual
, чтобы компилятор видел связь между ними. Если вы этого не сделаете, компилятор, вероятно, предупредит вас, что конструктор TMinMatrix «скрывает» конструктор TMatrix. Итак, правильный код будет:
type
TMatrix = class
protected
//...
public
constructor Create(Rows, Cols: Byte); virtual; // <-- Added "virtual" here
//...
type
TMinMatrix = class(TMatrix)
private
//...
public
constructor Create(Rows, Cols: Byte); override; // <-- Added "override" here
constructor CreateCopy(var that: TMinMatrix);
destructor Destroy; override; // <-- Also make the destructor "override"!
end;
Обратите внимание, что вы также должны сделать свой деструктор override
.
Представляем конструктор с разными параметрами
Обратите внимание, что вы можете переопределить конструктор только с тем же списком параметров. Если дочернему классу нужен конструктор с другими параметрами, и вы хотите предотвратить непосредственный вызов конструкторов базового класса, вы должны написать:
type
TMyMatrix = class(TMatrix)
//...
public
constructor Create(Rows, Cols, InitialValue: Byte); reintroduce; virtual;
//...
end
implementation
constructor TMyMatrix.Create(Rows, Cols, InitialValue: Byte);
begin
inherited Create(Rows, Cols); // <-- Explicitly give parameters here
//...
end;
Надеюсь, это прояснит ситуацию ... Удачи!