Wywołanie metody za pomocą wskaźnika pustego ma niezdefiniowane zachowanie. Kod jest nieprawidłowy, ale kompilator nie musi Cię o tym informować.
Standard C++ definiuje wiele przypadków, w których, mimo że kod jest nieprawidłowy, kompilator nie musi podawać "diagnostyki". W wielu przypadkach powodem jest fakt, że kompilator ma trudności z ustaleniem, czy kod jest ważny. W twoim konkretnym kodzie jest to dość łatwe, a niektóre kompilatory mogą w rzeczywistości ostrzegać o tym, jeśli użyjesz odpowiedniego poziomu ostrzeżenia. Jednak nie byłoby zbyt trudno skonstruować bardziej skomplikowany przykład, w którym kompilator nie mógłby łatwo stwierdzić, czy wskaźnik był pusty, czy nie. Standaryzacja tego, jak skomplikowany musi być kod, zanim kompilator nie będzie wymagał diagnostyki, byłaby trudna i prawdopodobnie bezcelowa, dlatego każda decyzja musi zostać podjęta, aby podjąć taką decyzję.
I odpowiedzieć na całą swoją przyszłość "nie powinienem mówić w C++, że robię coś złego" z wyprzedzeniem: nie. C++ optymalizuje w dużym stopniu przypadek, w którym działa twój program, kosztem mówienia prawie nic o przypadku, w którym masz błąd. – user2357112