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

class B 
{ 
    protected: 
    string word; 
}; 

class Derived: public A, public B 
{ 

}; 

如何將變量的無障礙wordDerived受到影響?我將如何解決它?多重繼承:相同的變量名

+4

請注意,除了下面的良好答案之外,儘可能避免此類名稱衝突總是一個好策略。 –

回答

27

這將是明確的,並且你會得到一個編譯錯誤說。

你需要使用正確的範圍內使用它:

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

當全班同學的Derived訪問word,你不得不宣佈

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

你的類Derived將有兩個變量,B::wordA::wordDerived你可以這樣訪問它們(如果你改變自己的訪問市民):

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

試圖訪問c.word將導致錯誤,因爲沒有現場機智h名稱word,但只有A :: word和B :: word。

裏面Derived他們的行爲像常規字段,同樣在名稱A::varB::var也在其他答案中提到。

21

可以使用using關鍵字告訴編譯器所使用的版本:

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

這告訴Derived類有一個保護成員word,這將是一個別名A::word編譯器。然後,無論何時使用Derived類中的非限定標識word,這將意味着A::word。如果你想使用B::word,你必須完全限定範圍。

+0

難道你不得不說什麼必須「使用」爲A :: word嗎?或者單獨使用A :: word'就夠了嗎? – dhein

+0

@Zaibis這就夠了,它基本上使'Derived :: word'成爲'A :: word'的別名。 –

+0

我正在拜託你,因爲我不習慣C++,因爲我和C在一起;) – dhein