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.

War es hilfreich?

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; };
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top