I think this is a compiler error and it should not work!
When you used the type TObjectHelper = class helper for TObject, this means that from this point the compiler will implicitly insert TObjectHelper instead of TObject.
First. AfterConstruction and BeforeDestruction hide the base virtual methods. And there should be a compiler warning about this.
Second.
TDescendant2 = class(TObject)
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
end;
This code should not be compiled because the methods being overridden are not virtual (in helper). The compiler should throw an error.
For comparison, Delphi also does not issue a warning for the first case, but gives a compilation error for the second.