У меня есть класс 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. Как это возможно?