Próbujesz przeciążyć wirtualne what() z biblioteki standardowej - OK. Tutaj znacząco pomogłoby oznaczenie tego, że Twoje what() jest przeciążeniem metody klasy bazowej - jest to opcjonalne, ale pomaga znacząco w znajdowaniu bugów.
const char * what() override {
return "wyjatek w1";
}
Po zrobieniu tego, dostajesz ładny komunikat kompilatora:
main.cpp:9:18: error: ‘const char* w1::what()’ marked ‘override’, but does not override
const char * what() override{
^~~~
Czyli, jak się okazuje, wcale nie przeciążyłeś metody klasy bazowej. Dlaczego? Bo ma inną sygnaturę.
http://en.cppreference.com/w/cpp/error/exception/what
`const` na końcu też musi się znaleźć.