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.

¿Fue útil?

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; };
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top