1) Ключевое слово virtual служит для создания виртуальных функций - которые должны быть переопределены в производном или производных классах.
2) Виртуальные функции позволяют использовать полиморфизм, когда имеются различные реализации виртуальных функций в классах наследниках от единого базового класса.
3) Ключевое слово virtual также может использоваться для создания виртуального наследования, которое позволяет избежать множественного наследования от нескольких классов с общим предком. При использовании виртуального наследования только один экземпляр класса-предка будет создан для всех классов-потомков, которые его наследуют.
4) Виртуальные функции реализуют динамическое связывание (dynamic binding) или так называемое позднее связывание (late binding), когда выбор подходящей функции выполняется на этапе выполнения программы. В этом случае выбор функции будет определяться типом объекта на который она ссылается, а не типом указателя (это будет реализация статического связывания)