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.