2010-12-24 4 views
5

다음 코드 세그먼트를 고려 객체 ++. 참조 유형에 할당하는 것과 참조 유형에 할당하지 않는 것의 차이점은 무엇입니까?행동 참조

답변

10

슬라이스 문제가 발생했습니다.

Window bRef =*button; 

여기서 bRef는 참조가 아니라 객체입니다. 파생 된 형식을 bRef에 할당하면 파생 된 부분을 잘라내어 CommandButton으로 구성된 Window 개체 만 남겨 둡니다.

bRef가 클래스 창에 대한 컴파일러 생성 복사 생성자를 사용하여 위의 명령문에서 작성됩니다. 이 생성자는 모두 RHS에서 새로 생성 된 객체에 구성원 요소를 복사합니다. 클래스에는 멤버가 없으므로 아무 것도 일어나지 않습니다.

참고 : 가상 멤버가있는 클래스에는 가상 소멸자가 있어야합니다.

+0

그래서이 복사본 생성자를 사용하여 후기 바인딩은 단순히 발생하지 않습니다. –

+0

Gunner : Late Binding은 여기에 관련이 없습니다. 동적으로 유형이 지정된 객체가 아닌 새로운 정적 객체를 만드는 경우 (참조 또는 포인터가 필요한 경우) –

+0

가상 또는 보호 된 소멸자. 많은 디자인에서 멤버 함수는 다형 적으로 삭제하지 않고 다형 적으로 호출됩니다. –

2
Window bRef=*button; 
bRef.Create(); // Output: Base class Window 

bRef 정적뿐만 아니라 동적 유형 Window 만이다. 가상 메커니즘은 참조와 포인터에서만 작동합니다. bRef은 참조 또는 포인터가 아닌 개체입니다.

1
Window bRef=*button; 
bRef.Create(); // Output: Base class Window 

여기 bRef는 (그냥 그렇게 이름) button에 대한 참조하지 않습니다. bRef는 기본 하위 객체 인 Window 만 가져옵니다.

+0

하지만 내가하고있는이 과제의 효과는 무엇입니까? * 버튼이 CommandButton을 사용하여 초기화되었으므로 컴파일 오류가 발생하지 않아야합니까? –

+0

아니요. 귀하의 Window 클래스에는 복사 생성자 윈도우 (const Window &)가 있습니다. CommandButton은 Window이므로 복사 생성자에 대한 인수가 될 수 있습니다. – cgmb

+0

@ Slavik81 : 예, 그렇습니까? 내가 말한 것을 어떻게 무효화합니까? – Nawaz

7
  • aRef
  • bRef 단순히
(복사 손실 된 CommandButton'부') 형 Window의 목적 Window정적 형이지만 CommandButton동적 유형이

일반적으로 object slicing으로 알려져 있습니다. 보통 두 클래스 모두 코드가 라인 Window& aRef = *button;에서 컴파일되지 못하게 만들기 때문에 기본 클래스를 추상화 (순수 가상 함수 제공)하거나 복사 불가능 (예 : boost::noncopyable 사용)하지 못하게했습니다.


지금, 왜 bRef.Create() 전화 Window::Create합니까? 글쎄, bRefWindow 이상의 아무것도 없으므로 대안이별로 없습니다. 이것은 본질적으로 Window을 선언하고 Create을 호출하는 것과 같습니다. CommandButton 부분이 복사본에서 손실 되었기 때문에 bRefCommandButton 인스턴스에서 복사되었다는 사실과 무관합니다.

표준을 인용하여이를 더 명확하게하려고 노력할 것입니다 (10.3/6)

[참고 : 가상 함수 호출 의 해석은 해석하는 반면, 그것은 호출 되는 오브젝트 (동적 유형)의 유형에 따라 비 가상 구성원 함수 호출의 경우 포인터 유형에만 또는 해당 개체 ( 정적 유형) (5.2.2)를 나타내는 참조가 해당됩니다. ]

포인터 또는 참조 간접 참조를 통해서만 객체의 정적 유형이 동적 유형과 다를 수 있습니다.