Mit Erklärung (Abgeleitete Klasse)
-
30-09-2019 - |
Frage
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(){}
Ist es denn, B1::fb()
als B1::fb(B1*)
and B2::fb()
behandelt wie B2::fb(B2*)
behandelt? Das heißt, die impliziten Parameter, helfen diese bei der Unterscheidung?
13.3.1 $ / 4 -
Für Nichtkonversion Funktionen eingeführt durch Verwendung einer Deklaration in einen abgeleiteten Klasse, wird die Funktion in Betracht gezogen ein Mitglied der abgeleiteten Klasse für Der Zweck der Definition der Art von die impliziten Objektparameter.
Lösung
Der C ++ Standard (C ++ 03 §7.3.3 / 12) erklärt:
Wenn eine using-Deklaration bringt Namen von einer Basisklasse in einen abgeleiteten Klasse Umfang, Elementfunktionen in der abgeleiteten Klasse überschreibt und / oder Ausblenden von Elementfunktionen mit den gleichen Namen und Parametertypen in einer Basis Klasse (und nicht in Konflikt).
In Ihrem Beispiel B2::fb()
Häute der B1::fb()
durch die Verwendung Deklaration eingeführt.
Was, warum es schlecht gebildet sowohl using B1::d;
und int d;
in der Definition von B2
zu haben, die C ++ Standard (C ++ 03 §7.3.3 / 10) erklärt:
Da ein using-Deklaration ist eine Erklärung, die Beschränkungen für die Erklärungen des gleichen Namen in der gleichen deklarativen Region auch auf gilt mit Deklarationen.
So ist es schlecht gebildet aus dem gleichen Grund, dass die folgende ist schlecht gebildet: es ergeben sich zwei Objekte mit demselben Namen in einem einzigen deklarative Region:
struct S { int d; int d; };