> 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.

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).

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.

Performance is important in my case. I will have very much of this objects.

It seems that virtual constructors are the only possibility.

Albert

Reply via email to