2017-10-09 92 views
4

以下是多重繼承的示例。我使用範圍解析運算符來解決模糊問題,而不是虛擬課堂。使用範圍分辨率避免多重繼承導致的模糊性

struct A 
{ 
    int i; 
}; 

struct B : A 
{}; 

struct C : A 
{}; 

struct D: B, C 
{ 
    void f() 
    { 
     B::i = 10; 
    } 
    void g() 
    { 
     std::cout << B::i <<std::endl; 
    } 
}; 

int main() 
{ 
    D d1; 
    d1.f(); 
    d1.g(); 
    return 0; 
} 

B::i良構?

+0

或者不打擾多重繼承。 – Ron

+3

@Ron - 有時候,你必須做你必須做的。 – StoryTeller

回答

5

B::i良構?

是的。最相關的參考是[class.qual]/1

如果一個合格的-ID的嵌套名稱符提名類,嵌套的名稱說明符後指定的 名類的 範圍擡頭,下面列出的情況除外。 名稱 應表示該類別的一個或多個成員或其 基類之一。

,指明瞭你可以考慮它是B的基地成員的名字i。之後只能檢查可訪問性,在你的情況下它是公開的。

[class.access.base]/5

...爲成員的訪問是由其中 成員被命名爲班級的影響。這種命名類是其中成員 名字被擡頭,發現類...當類名爲N如果

  • 存在N的基類B A構件m是在點 ř訪問可在R處訪問,m在B中命名時可在R處訪問。
1

是的。這些是C標準的語法規則的提取++:

id-expression: 
    unqualified-id 
    qualified-id 

postfix-expression: 
    [...] 
    postfix-expression . template[opt] id-expression 
    [...] 

在[class.mcft.non靜電]:

當ID-表達式(8.1),其不是類構件的一部分訪問語法(8.2.5)並且不用於形成 指向成員(8.3.1)的指針在可以使用此類的成員(8.1.2)中用於類X的成員中,如果 名稱查找(6.4 )將id表達式中的名稱解析爲某個類 C的非靜態非類型成員,並且如果可能評估了id表達式,或者C是X或X的基類,則id表達式爲 將(* this)(12.2.2.1)作爲後綴表達式 轉換爲類成員訪問表達式(8.2.5)。運營商。