4

class A,B,C,DA がベースで、B、C がその間にあり、D がダイヤモンド モデルで派生した場所があるとします。

ノート:

class Bプライベートモードでvirtualyclass Aを継承し、

class C保護モードでvirtualyclass Aを継承します。

class A
{
public:
    int member;  // note this member
};
class B :
    virtual private A // note private 
{

};
class C :
    virtual protected A // note protected
{

};
class D :
    public B, // doesn't metter public or whatever here
    public C
{

};

int main()
{
    D test;
    test.member = 0; // WHAT IS member? protected or private member?
    cin.ignore();
    return 0;
}

メンバーのインスタンスを作成すると、class Dメンバーはどうなるでしょうか。プライベートまたは保護された笑?

フィギュア No2:

そのようにするとどうなるでしょうか:

class B :
    virtual public A // note public this time!
{

};
class C :
    virtual protected A // same as before
{

};

memberこの2番目の例では公開されると思いますよね?

4

1 に答える 1

7

§11.6 Multiple access [class.paths]

多重継承グラフを介して複数のパスで名前に到達できる場合、アクセスはほとんどのアクセスを提供するパスのアクセスです。[例:

class W { public: void f(); };
class A : private virtual W { };
class B : public virtual W { };
class C : public A, public B {
   void f() { W::f(); } // OK
};

を介してパブリックパスに沿ってW::f()利用できるため、アクセスが許可されます。—例を終了]C::f()B

他に何も追加する必要はないと思いますが、この欠陥レポート(「欠陥ではない」としてクローズされた)も参照してください。

于 2012-01-22T00:57:51.570 に答える