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 claseBase
y en una claseDerived
, derivada directa o indirectamente de laBase
, una función miembrovf
con el mismo nombre, lista de tipos de parámetros ([dcl.fct]), calificación cv , y ref-qualifier (o ausencia de lo mismo) comoBase::vf
se declara, luegoDerived::vf
también es virtual (esté o no así declarado) y reemplaza aBase::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?