TClass объявлен как "Class of TObject
" в system.pas. Какой конструктор вызывается, определяется во время компиляции, и все, что знает компилятор, это какой базовый класс вы используете. Он не знает, каким будет значение переменной при запуске, поэтому он должен по умолчанию использовать базовый класс. Если вы используете TClass, то ваш базовый класс - TObject.
Если вы используете переменную класса, я предполагаю, что у вас какая-то иерархия, и вы пытаетесь реализовать фабрику. Если вы хотите убедиться, что правильный конструктор вызывается на основе значения переменной класса во время выполнения, а не того, что содержится в вашем коде во время компиляции, вам нужен виртуальный конструктор.
type
TMyBaseObject = class(TObject)
public
constructor Create; virtual;
end;
TMyClass = class of TMyBaseObject;
Используйте TMyClass вместо TClass в качестве переменной класса, и теперь компилятор сгенерирует вызов TMyBaseObject.Create, который является виртуальным. Убедитесь, что все ваши производные классы переопределяют базовый конструктор, и в итоге вы вызовете правильный конструктор.