Zastępowanie metod nie-wirtualnych

Załóżmy, że ten scenariusz występuje w Visual C ++ 2010:

#include <iostream>
#include <conio.h>

using namespace std;

class Base
{
public:
    int b;
    void Display()
    {
        cout<<"Base: Non-virtual display."<<endl;
    };
    virtual void vDisplay()
    {
        cout<<"Base: Virtual display."<<endl;
    };
};

class Derived : public Base
{
public:
    int d;
    void Display()
    {
        cout<<"Derived: Non-virtual display."<<endl;
    };
    virtual void vDisplay()
    {
        cout<<"Derived: Virtual display."<<endl;
    };
};

int main()
{
    Base ba;
    Derived de;

    ba.Display();
    ba.vDisplay();
    de.Display();
    de.vDisplay();

    _getch();
    return 0;
};

Teoretycznie wyjście tej małej aplikacji powinno być:

Baza: wyświetlacz inny niż wirtualny.Baza: wirtualny wyświetlacz.Baza: wyświetlacz inny niż wirtualny.Pochodzi: Wirtualny wyświetlacz.

ponieważ metoda Display klasy Base nie jest metodą wirtualną, więc klasa Derived nie powinna być w stanie jej zastąpić. Dobrze?

Problem polega na tym, że po uruchomieniu aplikacji drukuje to:

Baza: wyświetlacz inny niż wirtualny.Baza: wirtualny wyświetlacz.Pochodny: wyświetlacz inny niż wirtualny.Pochodzi: Wirtualny wyświetlacz.

Więc albo nie zrozumiałem pojęcia metod wirtualnych, albo coś dziwnego dzieje się w Visual C ++.

Czy ktoś może mi pomóc z wyjaśnieniem?