Analicemos esto.La declaración:
void virtual func() throw (int, float) = 0;
tiene 2 construcciones sobre las que pregunta. el constructo =0
le dice al compilador que la función declarada es 'abstracta', que le dice al compilador que la función no necesita ser definida en el class Foo
(aunque puede ser - pero generalmente no lo es) y que un objeto class Foo
no puede ser creado directamente, ya sea local, global o vía new
. Sin embargo, puede tener punteros o referencias a objetos de class Foo
. Algunas clases derivadas necesitan anular la función como una función no abstracta: los objetos de esa clase se pueden crear directamente (siempre que no haya otras funciones abstractas que no se hayan hecho "concretas").
La construcción throw (int, float)
es una especificación de excepción. Esto le dice al compilador que el contrato de la función es que solo lanzará excepciones de tipo int
o float
si arroja una excepción. Si la función arroja algún otro tipo de excepción, el compilador está obligado a manejar eso especialmente (llamando al std::unexpected()
).
Ahora, si intenta reemplazar esa función en una clase derivada con la siguiente declaración:
void virtual func() throw(short);
¿Estás diciendo que el contrato de la función es que va a lanzar excepciones de tipo short
si una excepción es arrojado. Sin embargo, lanzar short
no es parte del contrato de la función que se reemplaza, por lo que el compilador no lo permite.
Si se declara la anulación de esta manera:
void virtual func() throw(float);
¿Estás diciendo que la anulación puede lanzar una float
, que forma parte del contrato de la declaración original (si nunca lanza un int
que doesn No rompa el contrato: el contrato original solo dice que la función puede arrojar un int
, aunque no es necesario.
La parte relevante de la norma es de 15.4/3 especificaciones Excepción:
Si una función virtual tiene un excepción de especificación, todos declaraciones, incluida la definición , de cualquier función que anulaciones que la función virtual en cualquier clase derivada de solo permitirá las excepciones permitidas por la especificación de excepción de la función virtual de clase base .
Tenga en cuenta que la norma establece explícitamente que una especificación de excepción no es parte de tipo de la función (15,4/12), así que un puntero de función puede, por ejemplo, punto a las funciones que tienen diferentes especificaciones de excepción.
Hola Michael, gracias por tu excelente respuesta. – q0987