2013-02-20 2 views
2

누군가가 내게 지난 5 줄을 설명 할 수 있습니까? Manager가 Employee에게 하위 오브젝트 일 때 왜 그런 일이 생깁니 까?C++, 하위 유형의 다형성?

ostream& operator << (
    ostream &, const Employee & 
); 
Employee e; 
Manager m; 
Employee &eRef1 = e; // OK!  
Employee &eRef2 = m; // OK! 
Manager &mRef1 = e; // Compile error! 
Manager &mRef2 = m; // OK! 
cout << e << m;  // OK! 
+0

당신은 다른 방법으로 그것을하고 있기 때문에. 위의 줄은 어떻게되어야 하는가입니다. Employee (e)가 실제로 Manager가 아닌 Accountant (Employee에서 파생 된 직원) 인 경우 일어날 일을 상상해보십시오. –

+0

"하위 오브젝트"가 의미하는 바를 설명하면. – juanchopanza

+0

'Manager'와'Employee'의 정의를 제공해야합니다. –

답변

5

: ManagerEmployee에서 유래가 (난 당신이 "ManagerEmployee에 하위 객체 인"말할 때 당신이 무슨 뜻인지 것 같다). 즉, Manager의 모든 인스턴스는 Employee의 인스턴스이지만 그 반대는 마찬가지입니다.

여기서 Manager에 대한 참조를 Employee 유형의 개체에 바인딩하려고합니다. 그러나 Employee의 인스턴스가 Manager의 인스턴스가 아니기 때문에 (그 반대의 경우입니다!) 오류가 발생합니다. 당신이 Manager에 대한 참조를 결합 할 수 있다면

Employee e; 
// ... 
Manager& m = e; // This won't work, but let's suppose it did... 
int s = m.get_size_of_managed_team(); // Huh? 

:

당신이 그 정확한 이유를 이해하려면, 당신은 하지이 오류가 발생 한 경우에 무슨 일이 일어날 생각하려고 객체가 이 아니고이 실제로 Manager 인 경우 실제 객체가 지원하지 않는 함수를 호출 할 수 있습니다. 이것은 혼란이 될 것입니다. 따라서 컴파일러는이 상황이 전혀 발생하지 않도록합니다.

3

참고 문헌은 다형성 행동을 나타낸다. 즉, 파생 클래스로 초기화 된 기본 클래스에 대한 참조를 가질 수 있습니다. 그러나 기본 클래스로 초기화 된 파생 클래스에 대한 참조를 가질 수는 없습니다.

EmployeeManager의 기초이므로 직원과 Manager 참조를 초기화 할 수 없습니다. 나머지 초기화 작업도 정상입니다.

Reference | Initialised with | Valid? 
----------|------------------|-------- 
Base&  | Base    | Yes 
Base&  | Derived   | Yes 
Derived& | Base    | No 
Derived& | Derived   | Yes 

이것은 직관적입니다. 왜 EmployeeManager이라는 위장으로 숨길 수 있습니까? 그런 곳에서 일하는 것을 상상해보십시오. 혼돈이 될 것입니다! 정확히 때문에 당신이 말한 무슨 일

1

클래스가 다른 클래스를 기반으로하는이 계층 구조에서는 이렇게 생각하면됩니다.

A -> B -> C ->하자 D

이 예에서 -> B는 당신이 그것을 그런 식으로 생각하는 경우 등

, 클래스가로 변신 할 수 A로부터 상속 의미 그것들보다 적은 클래스 (왼쪽) : D는 C, B 또는 A가 될 수 있습니다. B의 경우, 오른쪽의 클래스는 체인의 "상위"에 있기 때문에 액세스 할 수 없습니다. 따라서 B를 B로 만들 수는 없습니다. 는 C, 또는 D

당신의 예에서

,

직원 -> 관리자

관리자는 왼쪽으로 Employee로 이동할 수 있으므로 사용자는 그런 식으로 변형 할 수 있지만 Manager는 Employee의 오른쪽에 있습니다. 이는 앞에서 설명한 것처럼 해당 전환을 불가능하게 만듭니다.

상속을 받으면 기본 클래스의 모든 이점을 얻을 수 있기 때문에 추론합니다. 변수, 함수, 그것 모두.체인을 올라가려고 할 때, 변수, 클래스 등을 추가하는 것이므로, 이제는 더 많은 메모리를 필요로하고 원래와 다르게 동작 할 것이므로 본질적으로 객체를 다시 만들어야합니다. 그러나 나무 아래로 내려 가면 양파를 벗기고 있습니다. 당신이 쫓고있는 양파의 자리를 드러내 기 위해 레이어를 벗겨냅니다. 그들은 모두 거기에있어, 그들은 작은 부분을 구성하기 때문에 그들은 직접 볼 수 없습니다.