Question

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(){}

est-ce parce que, B1::fb() est traité comme B1::fb(B1*) de and B2::fb() traité comme B2::fb(B2*)? C'est, fait le paramètre implicite, aide à distinguer ces?

  

13.3.1 $ / 4 -

     

Pour les fonctions non-conversion introduit   par une déclaration en utilisant dans un dérivé   classe, la fonction est considérée comme   être un membre de la classe dérivée de   dans le but de définir le type de   le paramètre d'objet implicite.

Était-ce utile?

La solution

C ++ standard (C ++ 03 §7.3.3 / 12) explique:

  

avec déclaration apporte des noms d'une classe de base dans un champ de classe dérivée, les fonctions membres de la substitution de la classe dérivée et / ou fonctions membres masquer avec les mêmes types de nom et paramètres dans une base classe (plutôt que contradictoires).

Dans votre exemple, B2::fb() cache le B1::fb() introduit par la déclaration à l'aide.

Pour ce qui est pourquoi il est mal formé pour avoir à la fois using B1::d; et int d; dans la définition de B2, le standard C ++ (C ++ 03 §7.3.3 / 10) explique:

  

Depuis avec déclaration est une déclaration, les restrictions sur les déclarations du même nom dans la même région déclarative appliquent également à à l'aide-déclarations.

Ainsi, il est mal formé pour la même raison que ce qui suit est mal formé: il en résulte deux objets avec le même nom dans une seule région déclarative:

struct S { int d; int d; };
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top