У меня есть класс Base
, определяющий explicit operator bool
:
struct Base {
virtual explicit operator bool() const {
return true;
}
};
И у меня есть подкласс Derived
, определяющий operator bool
:
struct Derived : Base {
operator bool() const override {
return false;
}
};
Как вы можете заметить, Derived::operator bool
явно не помечен explicit
, но отмечен override
, поэтому я ожидал, что компилятор будет жаловаться. Однако, как gcc, так и clang, похоже, согласны с тем, что это действительно. Было ли мое ожидание необоснованным?
Кроме того, если я использую классы следующим образом, TakesBool(base)
не компилируется (как ожидалось), но TakesBool(derived)
делает:
void TakesBool(bool b) {}
int main() {
//Base base; TakesBool(base); // compilation error (as expected)
Derived derived; TakesBool(derived);
return 0;
}
Это, по-видимому, указывает на то, что Derived
имеет (не explicit
) operator bool
, который, однако, помечен override
без объявления virtual
. Как это возможно?