overload operator assignment c++ c++11 operator-overloading override explicit

c++ - operator - Anulación de operador de conversión explícita virtual



overload operator c++ (1)

Podría pensar que el operator bool no explicit operator bool en Derived no reemplaza explicit operator bool explicit operator bool en Base , no, lo hace . El especificador explícito no importa, no es una parte de la firma de función.

De la norma, §10.3 / 2 Funciones virtuales [class.virtual] :

(énfasis mío)

Si una función miembro virtual vf se declara en una clase Base y en una clase Derived , derivada directa o indirectamente de la Base , una función miembro vf con el mismo nombre, lista de tipos de parámetros ([dcl.fct]), calificación cv , y ref-qualifier (o ausencia de lo mismo) como Base::vf se declara, luego Derived::vf también es virtual (esté o no así declarado) y reemplaza a Base::vf .

Por lo tanto, el compilador se quejará solo cuando el nombre, la lista de tipos de parámetros, la calificación de cv o la calificación de referencia de la función no coincidan, el especificador explícito no será considerado.

Usted dijo " override marcada sin una declaración virtual ", tenga en cuenta que la declaración virtual para la función miembro en la clase derivada es superflua, también es virtual .

Tengo una clase Base define un explicit operator bool :

struct Base { virtual explicit operator bool() const { return true; } };

Y tengo una subclase Derived , que define un operator bool :

struct Derived : Base { operator bool() const override { return false; } };

Como puede observar, Derived::operator bool está explícitamente marcado como explicit , pero está marcado como override , por lo que esperaba que el compilador se quejara. Sin embargo, tanto gcc como clang parecen estar de acuerdo en que esto es válido. Fue mi expectativa irrazonable?

Además, si uso las clases de la siguiente manera, TakesBool(base) no compila (como se esperaba), pero TakesBool(derived) hace:

void TakesBool(bool b) {} int main() { //Base base; TakesBool(base); // compilation error (as expected) Derived derived; TakesBool(derived); return 0; }

Esto parece indicar que Derived tiene un operator bool (no explicit ), que, sin embargo, está marcado como override sin una declaración virtual . ¿Cómo es esto posible?