Я в курсе, что virtual не обязательное ключевое слово и не должно влиять на переопределение.
Но!
С этим кодом все в порядке:
struct A
{
    /// Слово virtual отсутствует
    std::string Get ()
    {
        return "AB";
    }
};
struct B : public A
{
    /// Переопределяем метод Get
    std::string Get()
    {
        /// Приводим this к A* и вызываем Get, удаляя первый символ
        return ( ( A* ) this ) -> Get () .erase (0, 1); 
    }
};
///...
std :: cout <<B().Get(); /// Все нормально, выводится 'B'
А с вот этим нет:
struct A
{
    /// Слово virtual присутствует
    virtual std::string Get ()
    {
        return "AB";
    }
};
struct B : public A
{
    /// Переопределяем метод Get
    std::string Get()
    {
        /// Приводим this к A* и вызываем Get, удаляя первый символ
        return ( ( A* ) this ) -> Get () .erase (0, 1); 
    }
};
///...
std :: cout <<B().Get(); /// main сразу завершается с возвратом что то около -14556645665566