Domanda

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

E 'perché, B1::fb() viene trattato come B1::fb(B1*) and B2::fb() trattati come B2::fb(B2*)? Cioè, fa il parametro implicito, aiuto nel distinguere questi?

  

$ 13.3.1 / 4 -

     

Per le funzioni mancata conversione introdotto   da una dichiarazione using in un derivato   classe, la funzione è considerata   essere un membro della classe derivata per   ai fini della definizione del tipo di   il parametro oggetto implicito.

È stato utile?

Soluzione

Lo standard C ++ (C ++ 03 §7.3.3 / 12) spiega:

  

Quando un dichiarazione using porta i nomi da una classe base in un ambito classe derivata, le funzioni di membro della sostituzione classe derivata e / o funzioni membro nascondere con lo stesso nome e parametri tipi in una base classe (piuttosto che in conflitto).

Nel tuo esempio, pelli B2::fb() il B1::fb() introdotta dalla dichiarazione utilizzando.

Per quanto riguarda il motivo per cui è mal formato per avere sia using B1::d; e int d; nella definizione di B2, lo standard C ++ (C ++ 03 §7.3.3 / 10) spiega:

  

Dal momento che un dichiarazione using è una dichiarazione, le restrizioni dichiarazioni con lo stesso nome nella stessa regione dichiarativa valere anche per usando-dichiarazioni.

Quindi, è mal formato per la stessa ragione che la segue è mal formato: il risultato e 'due oggetti con lo stesso nome in una sola regione dichiarativo:

struct S { int d; int d; };
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top