액세스 제어 및 정적 멤버
기본 클래스를 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에 대한 전용 간접 기본 클래스이므로 이러한 변환이 허용되지 않습니다. 직접 파생 클래스에 대한 포인터에 대해서만 전용 기본 클래스 형식으로 변환할 수 있습니다. 따라서 Derived1 *형식의 포인터를 Base * 형식으로 변환할 수 있습니다.
선택하기 위한 포인터, 참조 또는 개체를 사용하지 않고 CountOf 함수를 명시적으로 호출하면 변환이 수행되지 않습니다. 따라서 호출이 허용됩니다.
파생 클래스인 T의 멤버 및 friend는 T에 대한 포인터를 T의 전용 직접 기본 클래스에 대한 포인터로 변환할 수 있습니다.