You desire: (Achievable with virtual inheritance)
  A  
 / \  
B   C  
 \ /  
  D      
And not: (What occurs in the absence of virtual inheritance)
A   A  
|   |
B   C  
 \ /  
  D    
Because of virtual inheritance, there will only be one instance of the base A class, rather than two.
Your type D would contain two vtable references (shown in the first figure), one for B and one for C, both of which essentially inherit A. D's object size has risen since it now holds two pointers, although there is only one A.
As a result, B::A and C::A are the same, and D cannot make any confusing calls. If virtual inheritance is not used, the second diagram above is displayed. Any call to a member of A becomes ambiguous, and you must indicate which path to take.