Utilizzando dichiarazione (classe derivata)
-
30-09-2019 - |
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.
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; };