다음 코드 세그먼트를 고려 객체 ++. 참조 유형에 할당하는 것과 참조 유형에 할당하지 않는 것의 차이점은 무엇입니까?행동 참조
행동 참조
답변
슬라이스 문제가 발생했습니다.
Window bRef =*button;
여기서 bRef는 참조가 아니라 객체입니다. 파생 된 형식을 bRef에 할당하면 파생 된 부분을 잘라내어 CommandButton으로 구성된 Window 개체 만 남겨 둡니다.
bRef가 클래스 창에 대한 컴파일러 생성 복사 생성자를 사용하여 위의 명령문에서 작성됩니다. 이 생성자는 모두 RHS에서 새로 생성 된 객체에 구성원 요소를 복사합니다. 클래스에는 멤버가 없으므로 아무 것도 일어나지 않습니다.
참고 : 가상 멤버가있는 클래스에는 가상 소멸자가 있어야합니다.
Window bRef=*button;
bRef.Create(); // Output: Base class Window
는 bRef
정적뿐만 아니라 동적 유형 Window
만이다. 가상 메커니즘은 참조와 포인터에서만 작동합니다. bRef
은 참조 또는 포인터가 아닌 개체입니다.
Window bRef=*button;
bRef.Create(); // Output: Base class Window
여기 bRef
는 (그냥 그렇게 이름) button
에 대한 참조하지 않습니다. bRef는 기본 하위 객체 인 Window
만 가져옵니다.
aRef
는bRef
단순히
CommandButton
'부') 형 Window
의 목적 Window
정적 형이지만 CommandButton
동적 유형이 일반적으로 object slicing으로 알려져 있습니다. 보통 두 클래스 모두 코드가 라인 Window& aRef = *button;
에서 컴파일되지 못하게 만들기 때문에 기본 클래스를 추상화 (순수 가상 함수 제공)하거나 복사 불가능 (예 : boost::noncopyable
사용)하지 못하게했습니다.
지금, 왜 bRef.Create()
전화 Window::Create
합니까? 글쎄, bRef
에 Window
이상의 아무것도 없으므로 대안이별로 없습니다. 이것은 본질적으로 Window
을 선언하고 Create
을 호출하는 것과 같습니다. CommandButton
부분이 복사본에서 손실 되었기 때문에 bRef
이 CommandButton
인스턴스에서 복사되었다는 사실과 무관합니다.
표준을 인용하여이를 더 명확하게하려고 노력할 것입니다 (10.3/6)
[참고 : 가상 함수 호출 의 해석은 해석하는 반면, 그것은 호출 되는 오브젝트 (동적 유형)의 유형에 따라 비 가상 구성원 함수 호출의 경우 포인터 유형에만 또는 해당 개체 ( 정적 유형) (5.2.2)를 나타내는 참조가 해당됩니다. ]
포인터 또는 참조 간접 참조를 통해서만 객체의 정적 유형이 동적 유형과 다를 수 있습니다.
그래서이 복사본 생성자를 사용하여 후기 바인딩은 단순히 발생하지 않습니다. –
Gunner : Late Binding은 여기에 관련이 없습니다. 동적으로 유형이 지정된 객체가 아닌 새로운 정적 객체를 만드는 경우 (참조 또는 포인터가 필요한 경우) –
가상 또는 보호 된 소멸자. 많은 디자인에서 멤버 함수는 다형 적으로 삭제하지 않고 다형 적으로 호출됩니다. –