私はちょうどこの問題に遭遇し、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++標準は、基本クラスポインタを介して保護されたメンバーへのアクセスを制限するのに苦労するのですか?
重複しない:派生クラスで保護されたメンバーにアクセスする、標準で禁止する理由をお聞きしたいです。