Объясняется это следующим образом. Тип int по умолчанию представляет собой signed int. Из этого следует, что, например, имея число "11", после побитной инверсии получим "-12". Всё остальное - дело техники.
Является Standart library class, но не входит STL, несмотря на то, что поддерживает множество функций для работы алгоритмов, а также схожие методы. Да и вообще, это всего лишь typedef на специализацию шаблона.
Виртуальные функции берут стандартный аргумент из самого Base класса. Поэтому ответ будет B1.
Многие стайлгайды запрещают это, потому что ведёт к таким странным ошибкам. Почему так сделано -- понятно, если у вас есть динамический тип, то мы должны где-то ещё хранить информацию о дефолтных аргументах, так как они обязаны вычисляться до вызова функции. Так как виртуализация в C++ сделана через разыменовывание vptr, где грубо говоря будут храниться указатели на функции, то единственный вариант дефолтного аргумента -- в самом интерфейсе.