#define private public is, strictly speaking, illegal. Section 17.4.3.1.1 of the C++ Standard states that "Nor shall such a translation unit define macros for names lexically identical to keywords." -- which means that an implementation would be permitted, if it so desired, to reject programs attempting the definition.
This would probably be no bad thing, though I'm not aware of any compiler (or preprocessor) that attempts to enforce this rule.