The thing to remember with virtual functions is that the access specifiers like public, private and protected are ignored.
That allows a derived function to override a base function based solely on the function prototype.
In your case a private virtual function can be called only by a member function of that class. Therefore, your private virtual base class method can be called only by a base class method.
However, if you have created a derived object and are accessing it using a base class pointer, then a public base class method can call a private base class method and if your derived class has overridden that private base class method what actually gets called is the derived class method. This is how you call private derived methods using a base class pointer.
The common usage is to implement a hook. Suppose a base method is to return a pointer to something but the something is not created by the base class but by a derived class. What you do is write a private virtual method in the base class that returns zero for the pointer. Therefore, if you create a base object and call a public method that calls this private virtual method you will get a zero indicating "not supported". However, if a derived class overrides this virtual base class method and you create a derived object and access it using a base class pointer, when the public base class method calls this private virtual base class method the call actually goes to the derived class method where the correct pointer is returned (remember it's a derived object).
Try it out. Done correctly, the derived class need only have private virtual methods forcing everyone to use the public base class methods. This is good design since the public base class methods are the interface to the polymorphic hierarchy.