Ответ 1
Вы можете подумать, что не explicit
operator bool
в Derived
не отменяет explicit
operator bool
в Base
, нет, он делает. Явный спецификатор не имеет значения, он не является частью сигнатуры функции.
Из стандарта $10.3/2 Виртуальные функции [Class.virtual]:
(акцент мой)
Если виртуальная функция-член
vf
объявлена в классеBase
и в классеDerived
, полученном прямо или косвенно изBase
, функция-членvf
с с тем же именем, параметр-type-list ([dcl.fct]), cv-qualification и ref-qualifier (или отсутствие такого же) какBase::vf
объявлен, тогдаDerived::vf
также является виртуальным (независимо от того, так объявлено) и он переопределяетBase::vf
.
Таким образом, компилятор будет жаловаться только тогда, когда имя, параметр-тип-список, cv-qualification или ref-qualifier функции не совпадают, явный спецификатор не будет рассмотрен.
Вы сказали "отмечен override
без объявления virtual
", обратите внимание, что объявление virtual
для функции-члена в производном классе не имеет значения, что также будет virtual
.