What are you trying to avoid? Hacking? You hacked this and claim that you can access the private member a->a; All the 'private' designation means is that you can't access it via referencing it normally in the compiler; there's no implied protection of the memory area.
Try "a->a = 200;" and the compiler will tell you that you can't access a private member. That is a COMPILE time protection; what you demonstrated is a RUNTIME access.
Incidentally, add this to your definition of the class A:
virtual ~A() { a = 0; }
and try your hack. The output will read 100 and 100 and then your program will crash, because the vtable pointer for the destructor was set to 200.