다음을 통해 공유


액세스 제어 및 정적 멤버

기본 클래스를 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의 전용 직접 기본 클래스에 대한 포인터로 변환할 수 있습니다.

참고 항목

참조

기본 클래스의 액세스 지정자