During the language design process, I did look at existing practices that achieved the same results as 'abstract'. Creating a private virtual destructor is one way to force someone to extend a class. And you've mentioned creating a private constructor.

The problem with all of these solutions is that they require metadata to be created. Solutions in native C++ allow a member function to never be defined as long as it is not called. Metadata does not allow that.

Ultimately, as a language designer, I see actual keywords and language features as a much better solution than work arounds and cool language tricks.

The name 'abstract' comes about because we are targeting the common language runtime. It is the name that is widely used across languages, and has the most cross language understanding. There is no confusion between the difference of an abstract function and a pure virtual function, and as result there is no reason to avoid using the term. Any C++ programmer should know what an abstract function is anyways.

Hope that makes sense,
Brandon Bray
Author of the C++/CLI language