@jamie: I am not sure I understand your reply. As ASerge details, base classes (and base objects) can have Create and it can be inherited. Self is indeed set, but that is actually the problem.
@ASerge: Thanks for the detailed answer.
Exceptions: Yes i can use that, but I can also have a boolean field to check, but I thought that fail is so elegant.
1. Fail in Classes: It works in FPC even in mode delphi. If it does not work in "real" Delphi, it is a bit of compatibility issue, although to the right direction (more allowed).
2. If Fail fails, isn't it a failure (OK, a bug, but could not resist, sorry)? However i do not know what would the correct way be to work. As your example shows even the Delphi way is wrong. 'TDescendant.Create end' is reached, meaning that code after the inherited line is executed, while the pointer is probably already zero. I cannot check (I do not use Windows / Delphi), but I can imagine that as the pointer is nil, any access of fields there is a GP fault. The correct probably would be that not even 'TDescendant.Create end' is reached, like with exceptions.
Last, but not least, your Delphi approach is not the same in FPC Delphi mode even for old objects (another small compatibility difference).