2013-11-04 5 views
18
class A 
{ 
    protected: 
    string word; 
}; 

class B 
{ 
    protected: 
    string word; 
}; 

class Derived: public A, public B 
{ 

}; 

Come sarebbe l'accessibilità della variabile word essere influenzata in Derived? Come lo risolverei?ereditarietà multipla: stesso nome di variabile

+4

Nota che, a parte le buone risposte qui sotto, è sempre buona norma evitare questo tipo di scontro di nomi il più possibile. –

risposta

27

Sarà ambiguo, e si otterrà un errore di compilazione dicendo che.

Avrete bisogno di usare il campo di applicazione diritto di usarlo:

class Derived: public A, public B 
{ 
    Derived() 
    { 
     A::word = "A!"; 
     B::word = "B!!"; 
    } 
}; 
3

Quando si accede word nella classe di Derived, si doveva dichiarare

class Derived: public A, public B 
{ 
    Derived() 
    { 
     A::word = X; 
     //or 
     B::word = x; 
    } 
}; 
5

La classe Derived avrà due variabili, B::word e A::word Al di fuori di Derived è possibile accedervi come questo (se si cambia il loro accesso al pubblico):

Derived c; 
c.A::word = "hi"; 
c.B::word = "happy"; 

che tentano di accedere c.word porterà ad un errore di , dal momento che non c'è campo ingegno h il nome word, ma solo A :: word e B :: word.

All'interno di Derived si comportano come normali campi, di nuovo, con i nomi A::var e B::var menzionati anche in altre risposte.

21

È possibile utilizzare la parola chiave using per dire al compilatore quale versione utilizzare:

class Derived : public A, public B 
{ 
protected: 
    using A::word; 
}; 

Questo dice al compilatore che la classe Derived ha un membro protetto word, che sarà un alias per A::word. Quindi, ogni volta che si utilizza l'identificatore non qualificato word nella classe Derived, si intende A::word. Se si desidera utilizzare B::word è necessario qualificare pienamente l'ambito.

+0

Non devi dire cosa deve essere "usato" per A :: word? o è abbastanza semplice usare A :: word? – dhein

+0

@Zaibis In realtà è abbastanza, rende 'Derived :: word' un alias di' A :: word', in pratica. –

+0

Ti sto credendo, ho appena chiesto che non sono così abituato a C++ come sono con C.;) – dhein