2010-05-28 2 views
7

나는 곧 테스트 할 샘플 질문을 할 생각이었습니다.이 질문은 완전히 혼란 스럽습니다. GraduateStudent은 다음 중 어느 의미, 개인 상속을 사용, 단어 "공개"만약C++의 간단한 상속

class GraduateStudent : public Student 
{ 
    ... 
}; 

생략 :

다음 코드를 고려?

  1. GraduateStudent 객체는 Student의 방법을 사용할 수 없습니다.

  2. GraduateStudentStudent의 개인 개체에 액세스 할 수 없습니다.

  3. GraduateStudent의 방법은 Student의 방법을 호출 할 수 없다.

  4. GraduateStudentconst 방법 만이 Student의 메소드를 호출 할 수 있습니다.

+4

그리고이 문제에 대한 귀하의 의견은 무엇입니까? –

+4

+1이 숙제임을 명시 적으로 나타냅니다. – Kena

+0

숙제 문제에 답하고 싶지 않다는 것을 이해합니다. 나는 이것을 생각해 봤는데, 개인적으로 불평 할 때, 기본 클래스의 public 및 private 메서드는 파생 클래스의 private 메서드라고 알고 있습니다. 코스 노트는 또한 "파생 된 클래스에서 사용할 수 있지만, 파생 된 클래스의 인스턴스에서 불러올 수는 없습니다"라고 말합니다. 완전히 이해하지 못했습니다. – xbonez

답변

22

이것은 숙제가 아닌 숙제이지만, 나는 끔찍한 질문이기 때문에 대답 할 것입니다. 나는 그것을 거의 트릭 질문이라고 생각할 것이고, 지식의 좋은 테스트를 위해 실제로 만들지는 않는다.

대답은 입니다. 2. GraduateStudent는 Student의 개인 객체에 액세스 할 수 없습니다.을 제외하고 이것은 개인 상속과는 전혀 관련이 없습니다. 파생 클래스 은 결코이 기본 클래스의 개인 멤버에 액세스 할 수 있기 때문에 포인트 2는 public 키워드가 존재하는지 여부에 관계없이 true입니다. 상속 방법에 관계없이 기본 클래스의 개인 멤버에 액세스 할 수 있습니다. (공공 상속 반대)

개인 상속은 기본적으로 두 가지를 의미합니다 GraduateStudent에서 Student 될 개인 방법

  1. 모든 공공 방법. 즉, Student에 public 메서드 foo()이있는 경우 GraduateStudentprivate 메서드 foo()입니다.

  2. 기본 클래스는 "액세스 할 수 없음"입니다. 즉, 다형성이 작동하지 않습니다. 평신도의 말에 따르면 GraduateStudentStudent에서 개인적으로 상속하는 경우 을 Student* (또는 Student& 인 것처럼 GraduateStudent&)처럼 처리 할 수 ​​없습니다.

질문 작성자가 1 번 째 대답은 정답이 될 수도 있지만 모호한 말로 간주 될 수 있습니다. "GraduateStudent 개체는 Student의 메서드를 사용할 수 없다"는 것은 무엇을 의미합니까?그것은이 당신이 유형 GraduateStudent의 객체에 Student로부터 상속 된 메소드를 호출 할 수 없습니다 것을 의미하는 의도가있을 가능성이, 내가 위의 첫 번째 점에 썼다, 그러나 같은 GraduateStudent 객체 자체, 메서드 내에서 , Student의 메소드를 사용하십시오. 예를 들어

:

class Student { 
    public: 
    void foo() {}; 
}; 

class GraduateStudent : Student { 
    public: 
    void bar() 
    { 
    foo(); // Legal 
    } 
}; 

int main() { 
    GraduateStudent g; 

    g.bar(); // Legal 
    g.foo(); // Illegal 

    return 0; 
}; 
+1

맞습니다. 질문의 저자가 (1)이 올바른 답이 될 수 있었지만 방금 맹렬히 말한 것이 아닌지 궁금합니다. – sechastain

+0

글쎄, 중복 (2) 또는 (1)과 (2) 중 하나이기 때문에 어느 쪽의 방법 (2)이라도 분명히 사실입니다. –

+0

"파생 클래스는 상속받은 방식에 관계없이 기본 클래스의 전용 멤버에 액세스 할 수 없습니다."라고 말합니다. 상속이 공개되어 모든 방법이 열악한 수업에 공개되면 그렇다면 왜 파생 클래스의 객체에 의해 액세스 할 수 없습니까? – xbonez

3

내가 2 볼 수 있지만, 개인적으로 또는 공개적으로 Student에서 여부 GraduateStudent 상속에 의존하지 않는 유일한 정답.

개인 상속은 GraduateStudentStudent 것을 개인의 지식, GraduateStudent 너무에만 친구와 할 수 static_castGraduateStudent&Student&GraduateStudent*Student*에 액세스 공용 또는 보호 된 멤버 변수 StudentGraduateStudent 회원이며, 공중 전화 것을 의미한다 또는 보호 된 멤버 함수 Student.

관련 항목 : http://www.parashift.com/c++-faq-lite/private-inheritance.html

3
1. GraduateStudent objects may not use methods of Student. 

사실 아니, 모든 GraduateStudent 객체는 내부적으로 (분명 개인 회원은 여기에 예외) 학생의 공용 또는 보호 된 멤버를 사용할 수 있습니다. 또한이 객체를 사용하는 모든 외부인은 객체의 기본 Student 클래스에 액세스 할 수 없으며 기본 클래스에 대한 액세스는 GraduateStudent 메소드의 컨텍스트 내에서 이루어져야합니다.

2. GraduateStudent does not have access to private objects of Student. 

3. No method of GraduateStudent may call a method of Student. 

하지 진정한

4. Only const methods of GraduateStudent can call methods of Student. 

아니, 것 const가 아닌 회원보다 기본 클래스에 더 접근을 가진 const를 회원에 만든 구분이 없다.

1

첫째 : 상속 액세스 지정이 DerivedBase와 상호 작용하는 방식을 수정하지 않습니다, 그것은이 Base 것처럼 세상이 Derived 개체를 처리 할 수있는 방식을 수정합니다.

고려 :

struct A{}; 
struct B: xxxx A 
{ 
    friend void friendly(); 
}; 
struct C: B {}; 

void outsider(); 

아주 간단한 테이블을 : 나는 A의 영역이 다양한 배우들이 액세스 할 수있는 요약합니다.

xxxx   public  protected  private 

B   pub/prot pub/prot  pub/prot 

friendly  pub/prot pub/prot  pub/prot * 

C   pub/prot pub/prot  -- 

outsider  pub   --    -- 

참고 (*) : 친구는 개체 자체와 동일한 권한을 가지고 있습니다. 놀랄 일도 아닙니다.

간단한 규칙은 상속 액세스 지정자가 기본 클래스의 액세스 지정자가 해당 설정보다 우선하는 경우이를 무시하는 것입니다.

아무 것도 public보다 느슨하지 않으므로 아무 것도 변경되지 않습니다.protectedBasepublic 섹션이 protected이되며 privatepublic 섹션과 protected 섹션이 private이된다는 것을 의미합니다.