2015-01-02 5 views
0

질문이 중복되면 용서합니다 ... 나는 만족스러운 답변을 얻을 수 없어서 내 방식 ....기본 클래스 생성자가 보호 된 경우 파생 클래스 함수에서 기본 클래스의 객체를 만들 수없는 이유는 무엇입니까?

은 위의 코드는 자료의 생성자가 보호 말하는 컴파일 오류가 thow합니다 샘플 코드를

class Base { 
protected: 
    Base() {} 
}; 
class Derived:public Base { 
public: 
    void func() { 
     Base obj; 
    } 
}; 

을 고려하십시오. 그러나 Main 클래스에서 Derived 클래스의 Object를 생성하면 Base 클래스의 생성자가 파생 클래스 함수에서 호출 될 수 있다는 것을 알게됩니다 (파생 클래스 생성자가 내부적으로 호출 한 것을 알게 됨). 그러면 파생 클래스 함수 내에서 Base 클래스 객체를 만들 수없는 이유는 무엇입니까?

그리고 한가지 더 .... 같은 클래스의 메소드 내부가 아닌 다른 클래스의 생성자를 보호하는 다른 방법이 있습니다 (싱글 톤을 생성하는 동안) ...?

답변

2

액세스 유형 protected은 상위 클래스에서 상속 된 "나만의"회원에게만 액세스 권한을 부여합니다. 예를 들어 Java, C++은 그 개념을 상당히 엄격하게 해석하여 동일한 인스턴스의 상속 된 멤버에만 액세스 할 수 있습니다.

생성자를 사용하여 기술적으로 다른 인스턴스의 비공개 구현 세부 정보에 액세스하려고합니다. 이는 금지되어 있습니다.

+0

따라서 기본 클래스의 정적 공용 메서드 (예 : Singleton 만들기) 이외의 보호 된 생성자를 가진 클래스의 개체를 인스턴스화하는 다른 방법이 있습니다. –

2

실수로 보호 된 기본 클래스 멤버에 액세스하려고한다고 생각하는 것입니다. 너는 그렇게하지 않는다. protected로 표시된 생성자를 사용하여 클래스의 인스턴스를 만들려고합니다. 생성자를 protected로 표시하면 해당 클래스의 인스턴스 생성을 특히 금지합니다. 이것은 파생 클래스의 생성자 내에서만 가능합니다. 그리고 그것이 당신이 main() 프로그램에서 작동하는 것을 발견 한 이유입니다.

보호 지정된 지정자를 제거하지 않고 Base의 인스턴스를 만드는 유일한 방법은 Derived의 인스턴스를 "Base"인스턴스로 만드는 것입니다. 또는 오버라이드 된 비헤이비어를 'Base'에 추가하지 않는 다른 파생 클래스를 만듭니다.

관련 문제