déclaration (classe dérivée) à l'aide
-
30-09-2019 - |
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.
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; };