개체 조각이 위험한시기/이유에 대해 공부하고 있습니다.Object slicing : pass 값에 의한 Base로 파생되었습니다 - 안전하거나 위험합니까?
나는 what is safe slicing VS dangerous slicing에 관한 훌륭한 링크를 읽었습니다. 여기
내가 (대략 말하기) 요약 할 수 있습니다 무엇 : -
- 안전 기본 유형이 값 (예를 들어
A
) 때. - 위험한참조 (예 :
A&
) 인 경우 위험한입니다.
그것을 읽은 후, 나는 비주얼 스튜디오 + ReSharper에서 (A VS 플러그인)에 테스트 코드를 만들었습니다.
내 경우는 안전라고 생각합니다. 그러나 표시된 줄에 #1
이라는 경고가 나타납니다. 내 믿음에서 모순의 방법으로
가능성이 의도하지 않은 객체 슬라이스 파생 클래스 C에서 값 초기화
class B1{ int field1=0; };
class B2{ int field2=0; };
class C: public B1,public B2{ };
class Test{
void f(B1 b){ } #2
void f2(){
C c;
f(c);
//^ possibly unintended object slicing #1
}
};
ReSharper에서 역할을합니다. 타입 값 때
- 경고.
- 없음 경고 타입 (
B1
에서B1&
로 변경 # 2) 참조인 경우. - 항상 경고 없음
C
은B1
에서만 파생됩니다. (B
또는B&
)
는 그것은 테이블로 요약함으로써 수 있습니다 : - 그러나, 여기
| #2=B1 | #2=B1&
==================================================
multi-inherit | warn* | no-warn*
--------------------------------------------------
inherit only from B1 | no-warn | no-warn
내가 기대하는 것입니다 : -
| #2=B1 | #2=B1&
===================================================================
multi-inherit | safe* | dangerous*
-------------------------------------------------------------------
inherit only from B1 | safe | safe
불일치가 *
와 마크입니다.
개체 조각에 대해 오해가 있거나 Resharper이 잘못 되었나요?
실제로 [슬라이스]는 [포인터 또는 참조] (https://stackoverflow.com/questions/15188894/why-doesnt-polyymismismwork-without-pointers-references)를 사용하면 값으로 지정할 때만 문제가 될 수 있습니다. 개체가 조각화되지 않고 올바르게 다형 적으로 동작합니다. – CoryKramer
(수정 됨) 좋은 지적!너는 옳은 것 같아. 나는 이제 그것을 이해한다. 감사! – javaLover
@CoryKramer 원하는 경우 솔루션으로 게시 할 수 있습니다. :) – javaLover