과부하 선택 (X(B&)
대 X(D&)
)과 두 가지 단계가 있습니다. 일단 완료되면 선택한 기능의 올바른 구현을 찾습니다. 전자는 컴파일 시간에 발생하고 정적 유형의 객체 의 및 인수에 따라, 후자는 실행시 발생과 개체의 동적 유형에 따라 (가 이가에 의존하지 않습니다 인수의 동적 유형).자신의 정적 형식 있도록이 D&
이며, d1
및 d2
은 D&
, 그리고 자신의 정적 유형 B&
그래서 b1
및 b2
는 B&
로 선언 다음과 같이
네 개의 개체가 선언됩니다. 정적 유형은 코드에서 선언 한 것입니다. 네 개의 참조가 실제로 당신이 main()
에 D
-objects으로 만든 개체를 참조하기 때문에 네 가지에 대한
그러나 동적 유형는 D
입니다.
따라서, 첫 번째 단계는, 과부하 선택 : 정적 유형 B&
이고 B
대한 클래스 정의는이 하나 개의 기능을 갖기 때문에 b1.X(b2)
및 b1.X(d2)
인 경우, 단지 하나의 가능한 과부하 X(B&)
이있다. 그러나 d1.X(b2)
및 d1.X(d2)
의 경우 정적 유형이 D&
이므로 오버로드 선택은 D
의 클래스 정의를 기반으로합니다. 따라서 두 가지 오버로드가 고려됩니다 (X(B&)
및 X(D&)
). 인수 b2
인 경우, 이전의 과부하가 선택되고, 인수 d2
때, 후자 과부하 정적 (= 선언) 개체와 인수 유형에 기반 – 모두 선택된다.
두 번째 단계는 선택한 과부하의 올바른 구현을 선택하는 것입니다. 이것은 런타임에 발생하며 객체의 동적 유형 (인수가 아님)에 따라 다릅니다. 따라서 b1.X(b2)
의 경우 동적 유형 b1
은 D
이므로 D::X(B&)
을 호출하게됩니다. b1.X(d2)
과 동일 : 이전 단계에서 선택한 과부하는 X(B&)
이지만 선택한 구현은 D::X(B&)
입니다. (D::X(D&)
은 다른 오버로드가 될 것이고 이미 오버로드가 정적 유형을 기반으로 선택 되었기 때문에이 시점에서 후보가 아닙니다. 오브젝트의 동적 형태는 정지형 같기 때문에 d1.X(b2)
및 d1.X(d2)
의 경우, 선택된 기능은, 첫 번째 단계, D::X(B&)
D::X(D&)
과 동일하다.
다형성은 포인터와 참조에서만 발생합니다. 값을 전달하면 'D'가 'B'로 분할됩니다. 또한 그것을 고치더라도,'B :: '를 통해'X'를 호출 할 때 과부하'D :: X (D)'가 보이지 않습니다. –
@SethCarnegie 참조를 포함하도록 게시물을 수정했습니다. 분명히 b1.X (b2)는 DX (B & b)를 호출 할 것입니다 ..... 이것은 내가 이해하지 못하는 것입니다 ... – user997112
'B'는'X (D)'함수가없고'D' 만 않습니다. 또한 함수의 인수 유형 (가상 또는 정적 중 하나)은 정적이 아닌 동적으로 가져옵니다. –