2016-06-25 4 views
2

다음 코드는 어떻게 작동합니까? MakeFinal 생성자는 보호되어 있으므로 FinalUser 클래스에 액세스 할 수 없어야합니다. 하지만 빌드 나 실행 오류가 발생하지 않았습니다.C++에서 다중 레벨 가상 상속의 보호 된 생성자

class MakeFinal 
{ 
protected: 
    MakeFinal(void) {}; 

public: 
    ~MakeFinal(void) {}; 
}; 

class Final : virtual public MakeFinal 
{ 
public: 
    Final(void) {}; 
    ~Final(void) {}; 
}; 

class FinalUser : public Final 
{ 
public: 
    FinalUser(void) {}; 
    ~FinalUser(void) {}; 
}; 

int main() 
{ 
    FinalUser *finalUserHeap_ = new FinalUser(); 
    return 0; 
} 
+0

'FinalUser'는'MakeFinal'에 직접 접근 할 필요가 없습니다. –

답변

0

파생 클래스 는 기본 클래스의 보호 멤버 액세스 할 수 있습니다. 이는 protectedprivate의 차이입니다.

1

당신은 다음 사항을 알고 있어야합니다 자료 및 아동의 인식

상속이 public 경우, 모든 자식이 자료에서 상속하는 것도 알고있다.

상속이 protected 인 경우 하위 및 하위 노드 만 Base에서 상속 받았다는 것을 알고 있습니다.

상속이 private 인 경우 하위가 아닌 다른 사람이 상속을 인식하지 못합니다. 이 따르면 Difference between private, public, and protected inheritance

에서

@Anzurio 대답. FinalUser 클래스 donot이 MakeFinal에 액세스 할 수있게하려면 private을 사용해야합니다.

1

virtual 기본 클래스는 가장 많이 파생 된 클래스의 생성자 멤버 초기화 자 목록에 의해 초기화됩니다.

virtual베이스가 여러 파생 클래스에 대한 공통 기본 클래스 개체가 될 수 있으며 이러한 파생 클래스로 지정된 초기화가 충돌 할 수 있기 때문입니다.

가장 파생 클래스 즉

FinalUser(void) {}; 

중 & hellip 상기 virtual 기본 클래스로부터 직접 유래 된 것처럼 가장 파생 된 클래스의 초기화 명세서 개념적 작용; MakeFinal 생성자 protected이기 때문에, 모든 파생 클래스에 사용할 수

FinalUser(): MakeFinal() {} 

에 해당합니다.

해당 내용은 FinalUser에 포함되어 있습니다. 다른 뉴스에서


:

이 코드의 이름은 “ 최종 ”, 그것에서 파생 된 (유용) 할 수없는 클래스를 만들기위한 C++ 03 트릭을 사용하는 방법에 대한 있다고 표시 수업. 트릭은 본질적으로 대부분의 파생 클래스로 작동 할 수있는 클래스 템플릿을 가지고 있으며 -ship을 사용하여 virtual 기본 클래스의 다른 클래스에 액세스 할 수없는 생성자에 액세스 할 수 있습니다. C++ 11에서는 final이라는 키워드를 사용하여 더 쉽게이 작업을 수행하고 virtual 상속의 오버 헤드가 발생하지 않았습니다.

+0

매우 완전한 대답입니다. – chema989

+0

Thanks - MakeFinal 클래스에 하나의 보호 된 함수 foo()를 추가하고 * finalUserHeap_를 통해 액세스하려고했지만 컴파일러에서 foo()에 finalUserHeap_에 액세스 할 수 없다고 말합니다. 이것은 당신이 설명하는 것이 생성자에게만 유효하다는 것을 의미합니까? – Ravi

+0

@Ravi : 생성자와 마찬가지로 'FinalUser' 클래스에서 액세스 할 수 있지만'FinalUser' 유형의 객체에 대한 호출이나 파생 된 경우에만 호출됩니다. 나는 당신의 테스트 코드가'Final' 또는'MakeFinal' 타입의 객체에 대해 호출했다고 생각합니다. 이 'protected'에 대한 제한은 실수로 기본 클래스를 파생시키고 형제 클래스의 보호 된 부분에 액세스하는 경우에 대한 경량 방어입니다. –