Myslím, že jsme se asi nerozuměli. Váš příklad je samozřejmě správně. V článku je psané : "Protože tato metoda ( GetType() ) není virtuální, objekt nikdy nemůže předstírat, že je jiného typu než ve skutečnosti je."
Analogie k vašemu příkladu - GetType() by byl m() : z výroku v článku plyne, že metoda m třídy B nemůže překrýt metodu m v tříde rodičovské (A). Tím, že není metoda GetType() deklarována jako virtualní, nemůžeme v odvozené třídě tuto metodu překrýt a předstírat, že např. objekt B je ve skutečnosti A (někdy se tomu říká type spoofing).
Samozřejmě GetType má mechanismus, který vždy vrací správný typ dané instance :
A.GetType().ToString() - vrátí řetězec "A"
B.GetType().ToString() - vrátí řetězec "B"
Doufám, že jsem situaci spíše vyjasnil, než více zamotal