По моему опыту, виртуальное наследование (в отличие от виртуальных методов ) почти никогда не требуется. В C ++ это используется для решения «проблемы наследования алмазов» , которая, если вы избегаете множественного наследования, на самом деле не может произойти.
Я почти уверен, что никогда не сталкивался с виртуальным наследованием вне книг на C ++, которое включает в себя как код, который я пишу, так и более миллиона систем строк, которые я поддерживаю.