Czytałem w wielu miejscach (na przykład here) o ludziach otrzymujących "czystą wirtualną metodę zwaną" błąd i awarię programu w runtime. This answer mówi, żeW jakich warunkach generowany jest czysty kod wirtualny?
Większość kompilatorów przypisuje takie pozycje vtable do kodu pośredniczącego, który emituje błąd przed przerwaniem programu.
i this one nawet mówi, że Itanium ABI określa, co to jest skrót.
Problem polega na tym, że wszystkie moje próby zobaczenia tego zachowania w działaniu przechwytuje kompilator (GCC 6.4.1) pod czas kompilacji jako niezdefiniowane odniesienia. Na przykład, podczas wywoływania czystą funkcję wirtualną z konstruktora z klasy abstrakcyjnej, pojawia się ostrzeżenie
pure virtual ‘virtual int X::f()’ called from constructor
ale w tym samym czasie po prostu brak kodu w ogóle jest generowany dla X::f()
więc to następuje
undefined reference to 'X::f()'
z łącznikiem i kompilacja zakończy się niepowodzeniem. Wydaje się to całkiem niezastąpionym sposobem zapobiegania błędowi w czasie wykonywania. W jakiej sytuacji mój kompilator rzeczywiście musiałby wygenerować wyżej wymieniony kod pośredniczący? Czy jest wystarczająco inteligentny, aby wystarczająco wcześnie wykryć wszystkie możliwe sytuacje patologiczne?
To nigdy nie wymagane do wygenerowania niedopałek. Wywołanie czystej wirtualnej metody jest niezdefiniowanym zachowaniem. Niektóre kompilatory wykorzystują permisywny charakter nieokreślonego zachowania, aby zapewnić go jako grzeczność. –