アクセス制御および静的メンバー
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 の関数を選択するにはthis は Base * を入力するように変換する必要があります。このような変換は Base が Derived2 に対するプライベート間接基本クラスであるため使用できません。プライベート基本クラスの型への変換は直接の派生クラスへのポインターでのみ使用できます。したがって Base * を入力する場合はDerived1 * 型のポインターに変換できます。
ポインターを使用せずに参照 CountOf の関数を明示的に呼び出すことに注意してサイズを変更するオブジェクトが変換を示します。したがって呼び出しが許可されます。
派生クラスのメンバーとフレンド T はT をプライベートに直接基本クラスへのポインターに T にポインターに変換します。