But in this case, it would also not call the constructor of my inherited classes. The assignment of the data inside the object is not the problem, I have other virtual functions I can use for this. But it is important, that the constructor of my inherited class is also called because it does some important and needed init-work (which depends on the inherited class).> I think, RTTI is very powerfull and there should be a way to do the > same as above without a virtual constructor. But is it clean? To use RTTI you must derive from TPersistent or use the {$M+} directive. > In practice, I have a abstract base class with a function like this: > > function TMyBase.CreateCopy(): TMyBase; > begin > Result := Self.ClassType.Create(); // this doesn't work because > ClassType is a TClass > // TODO: fill the result with same data ... > end; With TPersistent it would work like this TMyBase = class(TPersistent) public function CreateCopy: TMyBase; procedure Assign(Source: TPersistent); override; end; it would be function TMyBase.CreateCopy: TMyBase; begin Result := TMyBaseClass(Self.ClassType).Create; Result.Assign(Self); end; Every class must override the Assign method to copy all added values.
Performance is important in my case. I will have very much of this objects.Another possibility: Use TComponent as base class. Then you can copy without writing the Assign procedures. The IDE uses this. It is much slower than the Assign approach.
It seems that virtual constructors are the only possibility.
Albert