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

class B 
{ 
    protected: 
    string word; 
}; 

class Derived: public A, public B 
{ 

}; 

Wie würde die Zugänglichkeit der variablen word in Derived betroffen sein? Wie würde ich es lösen?Mehrfachvererbung: gleicher Variablenname

+4

Beachten Sie, dass es abgesehen von den guten Antworten unten immer eine gute Strategie ist, diese Art von Namenskonflikten so weit wie möglich zu vermeiden. –

Antwort

27

Es wird nicht eindeutig zu erklären, und Sie werden ein Übersetzungsfehler, dass zu sagen bekommen.

Sie müssen den richtigen Rahmen verwenden, es zu benutzen:

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

Wenn word in der Klasse von Derived Zugriff hatten Sie

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

Ihre Klasse Derived werden zwei Variablen, B::word und A::word Außerhalb Derived Sie können sie wie folgt zugreifen (wenn Sie ihren Zugang ändern an die Öffentlichkeit):

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

den Zugriff Der Versuch wird c.word, zu einem Fehler führen, da kein Feld Witz gibt es h der Name word, aber nur A :: Wort und B :: Wort.

Innerhalb Derived verhalten sie sich wie normale Felder, wieder mit den Namen A::var und B::var auch in anderen Antworten erwähnt.

21

können Sie das using Schlüsselwort verwenden, um den Compiler, welche Version zu sagen, zu verwenden:

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

Dies teilt den Compiler mit, dass die Derived Klasse word, ein geschütztes Mitglied hat, die ein Alias ​​A::word sein wird. Dann, wenn Sie die uneingeschränkte Kennung word in der Derived Klasse verwenden, wird es A::word bedeuten. Wenn Sie B::word verwenden möchten, müssen Sie den Geltungsbereich vollständig qualifizieren.

+0

Müssen Sie nicht sagen, was für A :: Wort "gebraucht" werden soll? oder ist "A: word" allein genug? – dhein

+0

@Zaibis Das wirklich genug ist, macht es 'Derived :: word' einen Alias ​​von' A :: word', im Grunde. –

+0

ich Sie beliving, fragte ich, so wie ich das nicht zu c verwendet bin ++, wie ich mit C. bin;) – dhein