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

class B 
{ 
    protected: 
    string word; 
}; 

class Derived: public A, public B 
{ 

}; 

Jak wpłynie na dostępność zmiennej word w Derived? Jak mam to rozwiązać?Wiele dziedziczenia: ta sama nazwa zmiennej

+4

Należy pamiętać, że oprócz dobrych odpowiedzi poniżej, zawsze dobrze jest unikać tego rodzaju starć nazw w jak największym stopniu. –

Odpowiedz

27

To będzie niejednoznaczna, a dostaniesz błąd mówiąc, że kompilacja.

Musisz użyć odpowiedniego zakresu użycia:

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

Przy dostępie word w klasie Derived, trzeba było zadeklarować

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

Twoja klasa Derived będzie mieć dwie zmienne, B::word i A::word Outside of Derived można z nich korzystać tak (jeśli zmienisz ich dostęp do publiczności):

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

Próba dostępu c.word doprowadzi do błędu, ponieważ nie ma wit pola h o nazwie word, ale tylko A :: word i B :: word.

Wewnątrz Derived zachowują się jak zwykłe pola, ponownie o nazwach A::var i B::var wspomnianych również w innych odpowiedziach.

21

Można użyć słowa kluczowego using aby poinformować kompilator, którą wersję użyć:

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

ten informuje kompilator, że klasa Derived ma chronioną członek word, który będzie alias do A::word. Wtedy za każdym razem, gdy użyjesz niekwalifikowanego identyfikatora word w klasie, będzie to oznaczać A::word. Jeśli chcesz użyć B::word, musisz w pełni zakwalifikować zakres.

+0

Czy nie musisz mówić, co ma być "użyte" dla słowa A :: word? lub czy samo użycie "A :: word" jest wystarczające? – dhein

+0

@Zaibis To wystarczy, czyni 'Wyprowadzenie :: słowo' w skrócie z' A :: word'. –

+0

Jestem ci wierny, właśnie zapytałam, ponieważ nie jestem taka, jak zwykłem w C++, ponieważ jestem z C.;) – dhein

Powiązane problemy