У меня есть класс 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
. Как это возможно?
Относительно необходимости «виртуального» в производном классе, если базовый класс был помечен как «виртуальный», он подразумевается также для всех производных классов. Ключевое слово 'override' является скорее намеком для компилятора, поэтому вы не пытаетесь переопределить функцию, используя другую сигнатуру (например, объявляя функцию в производном классе, которая принимает разные аргументы, чем функция в базовом классе). Таким образом, эти ключевые слова не имеют отношения к вопросу. –
Виртуальная отправка все еще происходит. 'Base * pbase = & производное; TakesBool ((bool) * pbase); 'будет вызывать' Derived :: operator bool'. Я думаю, что «явный» не считается частью сигнатуры функции, поэтому вам разрешено переопределять «явное» преобразование с помощью «неявного». Я не уверен, правильно ли это поведение. –
Это похоже на функцию 'protected: virtual' в базовом классе с' public: override' в производном классе. Не проблема. –