다음을 통해 공유


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

파생 클래스에서 액세스할 수 있는 기본 클래스의 멤버는 두 가지 요인으로 인해 결정됩니다. 이와 동일한 요인이 파생 클래스의 상속된 멤버에 대한 액세스도 결정합니다.

  • 파생 클래스가 class-head공용 액세스 지정자를 사용하여 기본 클래스를 선언하는지 여부(class-head클래스 형식 정의의 문법 단원에 설명되어 있음)

  • 기본 클래스의 멤버 액세스

다음 표에서는 이러한 요인과 기본 클래스 멤버 액세스를 확인하는 방법 간의 상호 작용을 보여 줍니다.

기본 클래스의 멤버 액세스

private

protected

Public

파생 액세스에 관계없이 항상 액세스할 수 없음

전용 파생을 사용하는 경우 파생 클래스에서 전용

전용 파생을 사용하는 경우 파생 클래스에서 전용

 

보호된 파생을 사용하는 경우 파생 클래스에서 보호됨

보호된 파생을 사용하는 경우 파생 클래스에서 보호됨

 

공용 파생을 사용하는 경우 파생 클래스에서 보호됨

공용 파생을 사용하는 경우 파생 클래스에서 공용

다음 예제는 이러한 과정을 보여 줍니다.

// access_specifiers_for_base_classes.cpp
class BaseClass
{
public:
    int PublicFunc();    // Declare a public member.
protected:
    int ProtectedFunc(); // Declare a protected member.
private:
    int PrivateFunc();   // Declare a private member.
};

// Declare two classes derived from BaseClass.
class DerivedClass1 : public BaseClass
{
};

class DerivedClass2 : private BaseClass
{
};

int main()
{
}

DerivedClass1에서는 BaseClass가 공용 기본 클래스이므로 멤버 함수 PublicFunc가 공용 멤버이고 ProtectedFunc가 보호된 멤버입니다. PrivateFunc는 BaseClass 전용이며 모든 파생 클래스에서 액세스할 수 없습니다.

DerivedClass2에서는 BaseClass가 전용 기본 클래스이므로 PublicFunc 및 ProtectedFunc 함수가 전용 멤버로 간주됩니다. 여기서도 PrivateFunc는 BaseClass 전용이며 모든 파생 클래스에서 액세스할 수 없습니다.

파생 클래스는 기본 클래스 액세스 지정자 없이 선언할 수 있습니다. 이 경우 파생 클래스 선언에 class 키워드가 사용되면 파생이 전용으로 간주됩니다. 파생 클래스 선언에 struct 키워드가 사용되면 파생이 공용으로 간주됩니다. 예를 들어, 다음 코드는

class Derived : Base
...

다음과 동일합니다.

class Derived : private Base
...

마찬가지로, 다음 코드는

struct Derived : Base
...

다음과 동일합니다.

struct Derived : public Base
...

전용 액세스가 있는 것으로 선언된 멤버는 기본 클래스에서 friend 선언을 사용하여 선언된 함수 또는 파생 클래스에서만 액세스할 수 있습니다.

공용 구조체 형식은 기본 클래스를 가질 수 없습니다.

참고

전용 기본 클래스를 지정할 때는 파생 클래스의 사용자가 멤버 액세스를 이해하도록 명시적으로 private 키워드를 사용하는 것이 좋습니다.

참고 항목

참조

멤버 액세스 제어