アクセス制御と静的メンバー
基底クラスを private として指定した場合、非静的メンバーにのみ影響します。 パブリックな静的メンバーは、派生クラス内でもアクセスできます。 ただし、ポインター、参照、またはオブジェクトを使用して基底クラスのメンバーにアクセスするには、アクセス制御が再び適用される時点で変換が必要になる場合があります。 次に例を示します。
// access_control.cpp
class Base
{
public:
int Print(); // Nonstatic member.
static int CountOf(); // Static member.
};
// Derived1 declares Base as a private base class.
class Derived1 : private Base
{
};
// Derived2 declares Derived1 as a public base class.
class Derived2 : public Derived1
{
int ShowCount(); // Nonstatic member.
};
// Define ShowCount function for Derived2.
int Derived2::ShowCount()
{
// Call static member function CountOf explicitly.
int cCount = Base::CountOf(); // OK.
// Call static member function CountOf using pointer.
cCount = this->CountOf(); // C2247. Conversion of
// Derived2 * to Base * not
// permitted.
return cCount;
}
このコードでは、アクセス制御により、Derived2 へのポインターから Base へのポインターへの変換が禁止されます。 this ポインターは暗黙的に型 Derived2 * です。 CountOf 関数を選択するには、これを Base * 型に変換する必要があります。 Base は Derived2 に対するプライベート間接基底クラスであるため、このような変換は許可されません。 プライベート基底クラス型への変換は、直接の派生クラスへのポインターにのみ使用できます。 したがって、型 Derived1 * のポインターは型 Base * に変換できます。
ポインター、参照、またはオブジェクトを使用して選択することなく CountOf 関数を明示的に呼び出すことは、変換を意味しないことに注意してください。 したがって、呼び出しは許可されます。
派生クラス T のメンバーとフレンドは T へのポインターを、T のプライベート直接基底クラスへのポインターに変換できます。