2017-10-09 10 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は整形式ですか?

はい、そうです。資格-IDの入れ子名前指定子がクラスを指名した場合、クラスの 範囲内で検索され、ネストされた名指定子の後に指定 名前

:最も適切な参照が[class.qual]/1ですただし、下記の場合を除きます。 という名前は、そのクラスの1つ以上のメンバー、または ベースクラスのうちの1つを表します。

これは、Bの基盤のメンバーであるという理由で、iという名前を付けることを指定しています。アクセシビリティは後でチェックされ、あなたの場合は公開されます。

[class.access.base]/5

...メンバーへのアクセスが メンバーが命名されているクラスの影響を受けています。クラスで指定されたN

  • 場合Nの基底クラスBが存在する場合、この命名クラスは、メンバー 名前をルックアップし、見つかったクラスです...メンバーmは点 Rでアクセス可能ですこれはRでアクセス可能であり、mはクラスBで命名されたときにRでアクセス可能です。
1

はい。それはクラスのメンバの一部でない場合、ID-式(8.1)

:[class.mcft.non静的]で

id-expression: 
    unqualified-id 
    qualified-id 

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

:これらは、C++標準の文法規則の抽出物であります 名前検索場合、アクセス部材(8.3.1)に ポインタを形成するために使用される構文(8.2.5)とではないが、これを使用することができるコンテキスト(8.1.2)のクラスXのメンバで使用され、(6.4 )は、id式の名前をいくつかのクラス Cの非静的非型メンバーに解決し、id式が潜在的に評価されるか、またはCがXまたはXの基本クラスである場合、id式は は、(* this)(12.2.2.1)を左下の後置式- として使用して、クラスメンバーアクセス式(8.2.5)に変換されます。オペレーター。