3

私はちょうどこの問題に遭遇し、C++標準から次のように定義されていることを知っています(私のものを強調してください)

非静的データメンバーまたは非静的メンバー関数がその命名クラス (11.2) の保護されたメンバーである場合、条項 11 で前述したものを超える追加のアクセスチェックが適用されます。アクセスがメンバーへのポインターを形成する場合 (5.3.1)、nested-name-specifier は C または C から派生したクラスを示す必要があります。他のすべてのアクセスには、 (おそらく暗黙の) オブジェクト式 (5.2.5)。この場合、オブジェクト式のクラスは C または C から派生したクラスでなければなりません。

コードスニペット:

class Base
{
protected: 
    int i;
};

class Derived : public Base
{
public:
    // I cannot define it as void memfunc(Derived* obj) because of signature requirement.
    void memfunc(Base* obj) 
    {
       obj->i = 0;  // ERROR, cannot access private member via Base*
       Derived* dobj = (Derived*)(obj);
       dobj->i = 0; // OK
    }
};

では、このチェックの理由は何ですか?なぜC++標準は、基本クラスポインタを介して保護されたメンバーへのアクセスを制限するのに苦労するのですか?

重複しない:派生クラスで保護されたメンバーにアクセスする、標準で禁止する理由をお聞きしたいです。

4

1 に答える 1

5

から派生したからといって、から派生したBase他のクラスの保護されたメンバーへのアクセスを許可する必要があるわけではありませんBaseDerived2から継承するライブラリによって提供されるクラスを想像してみてくださいBase。このようにして、 のベース オブジェクトを取得Derived2し、 のコードで必要なことを行うことができますDerived

したがって、基本的に、標準では、継承した保護されたメンバーのみを変更し、無関係な兄弟クラスの整合性を台無しにしないことが保証されます。

于 2013-11-06T04:17:32.850 に答える