2010-08-23 15 views
6
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(){} 

Forse perché, B1::fb() è trattata come B1::fb(B1*)and B2::fb() trattati come B2::fb(B2*)? Cioè, il parametro implicito aiuta a distinguerli?Utilizzando dichiarazione (classe Derived)

$ 13.3.1/4-

Per le funzioni non conversione introdotte da una dichiarazione using in un derivato classe, la funzione è considerata essere un membro della classe derivata per fini di definizione del tipo di parametro implicito dell'oggetto.

risposta

9

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

Quando un dichiarazione using porta i nomi da una classe base in un ambito di classe derivata, le funzioni membro nella classe derivata sovrascrivono e/o nascondono funzioni membro con lo stesso nome e tipi di parametro in una classe base (anziché in conflitto).

Nell'esempio, B2::fb() nasconde lo B1::fb() introdotto dalla dichiarazione di utilizzo.

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

Dal momento che un using-declaration è una dichiarazione, le restrizioni sulle dichiarazioni con lo stesso nome nella stessa regione dichiarativa si applicano anche a using-declaration.

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

struct S { int d; int d; }; 
+0

e int d conflitti con la precedente dichiarazione di esso dall'uso ... – diverscuba23

+0

qual è la vera implicazione di $ 13.3.1/4 in quel caso? – Chubsdad

+1

@chubsdad: Poiché 'B2 :: fb()' nasconde 'B1 :: fb()', 'B1 :: fb()' non è considerato una funzione candidata durante la risoluzione di sovraccarico, quindi §13.3.1/4 non non si applica. –

Problemi correlati