am I wrongthinking that Object Pascal was made to compete vs C++ and Plain Pascal was about to compete with C?
I don't think object pascal is made to compete with C++, at least not what was implemented in Delphi over the time.
Classes in particular are weird if you look at pascals history. They are always placed on the heap, always referenced by pointers, but completely hide this from the user but still require manual memory management, even though this is completely different from regular memory management (new, dispose) used by oldschool objects.
These classes and the subsequent implementation of the RTL an VCL using classes, results more in Dephi getting much more similar to Java than to C++.
From a performance programming perspective this makes absolutely no sense. For example using a TStringList to split a string requires the additional allocation of the class on the heap. With an old style object, the required variables that the stringlist uses internally would be placed on the stack and no overhead would be gained than if no OOP was used.
Classes always bring additional overhead, and due to manual memory management. Also the standard libraries heavily make use of abstract base classes and inheritance with virtual methods and stuff. In fact some methods like the destructor must be always virtual. If you look at C++ this is not the case. Sure the C++ standard library implementations also makes heavy use of inheritance for reducing the code complexity, but in most of the classes like vector, set, etc. you won't find any virtual methods. More often than not virtual methods are avoided using the
CRTP idiom which allows for
static or bounded polymorphism using templates. This limits or completely avoids virtual call chains and makes a lot of the code inlinable and getting rid of virtual table jumps.
Another thing I found about C++ is the heavy usage of templates (generics in pascal) for class configuration. For example, to implement a custom sorting algorithm for a TStringList, you set a function pointer in the TStringList instance. In C++ you configure such things via template parameters. This has the consequence, that in Pascal this code can not be optimized, as the compiler does not know at compiletime what function will be used, while in C++ this is a complete runtime decision.
With all of that, I don't think that Delphi is (anymore) really a competitor to C++, it is much more going into the Java direction. This is btw IMHO nothing wrong. Java is a successful language because it makes a lot of things very easy, so does Delphi. CRTP is much more complicated than classical inheritance, C++ templates are turing complete, which makes them great to put computations into the compiletime and give the optimizer more to work with, but simulatniously template programming is really complicated.
If this is a good or a bad thing is something one can evaluate for himself. If you don't need maximum efficiency, this kind of stuff would require much more effort for people to learn and use Pascal. And still, it is not hard to use a C++ library in Pascal, so one can simply use the language best fitted for the task.