Declaración using (clase derivada)
-
30-09-2019 - |
Pregunta
struct B1{
int d;
void fb(){};
};
struct B2 : B1{
using B1::d;
using B1::fb;
int d; // why this gives error?
void fb(){} // and this does not?
};
int main(){}
¿Es porque, B1::fb()
se trata como B1::fb(B1*)
and B2::fb()
tratados como B2::fb(B2*)
? Es decir, ¿el parámetro implícito, ayuda a distinguir estos?
$ 13.3.1 / 4 -
Para funciones no se convierta introdujo por un usando-declaración en un derivado clase, la función se considera ser un miembro de la clase derivada de el propósito de definir el tipo de el parámetro objeto implícito.
Solución
El ++ estándar C (C ++ 03 §7.3.3 / 12) explica:
Cuando un usando-declaración trae nombres de una clase base en un ámbito de clase derivada, funciones miembro en la anulación clase derivada y / o funciones miembro ocultar con el mismo nombre y parámetros tipos en una base de clase (en lugar de en conflicto).
En su ejemplo, cueros B2::fb()
la B1::fb()
introducido por el uso de la declaración.
En cuanto a por qué es mal formada para tener tanto using B1::d;
y int d;
en la definición de B2
, el estándar de C ++ (C ++ 03 §7.3.3 / 10) explica:
Desde un using-declaración es una declaración, las restricciones a las declaraciones del mismo nombre en la misma región declarativa también se aplican a using-declaraciones.
Por lo tanto, está mal formada por la misma razón que lo siguiente es mal formada-: da lugar a dos objetos con el mismo nombre en una sola región declarativa:
struct S { int d; int d; };