2017-09-19 7 views
1

C++에서 참조 캐스트를 오버로드 할 수 있습니까?C++ 참조 캐스트 오버플로 (다운 캐스팅 상속)

나는 형식으로 만지지 수있는 코드있어 :

내가 행동을 조정하고 싶습니다

void someMethod(Parent& parentReference, ...){ 
    ... 
    Child& child = static_cast<Child&>(parentReference); 

(클래스의 하위 클래스의 부모에서 직접 공개적으로 상속을) 이 캐스트의 - 나는 하위 클래스를 수정할 수 있습니다.
그래서 같이 캐스트 연산자를 오버로딩 시도했다 : 그러나이 방법은 결코

Parent::operator Child&(){ 
    ... 

를 호출되지됩니다.

이것이 가능한지 궁금한가요?

편집
당 R Sahu, 내가있어이 시나리오에 가까운 : https://timsong-cpp.github.io/cppwp/n3337/expr.static.cast#2

struct B { }; 
struct D : public B { }; 
D d; 
B &br = d; 

static_cast<D&>(br);   // produces lvalue to the original d object 
것을 제외하고

대신 단순히 B &br = d;을 할당 br 인수의 방법으로 제공, 이전이다 네트워크를 통해 NML로 전송됩니다.

struct B { }; 
struct D : public B { 
    int a; 
    int b 
}; 

D d; 
d.a = x; 
d.b = y; 

server.send(d); 

... 

client.receive(msg); 

receive(B& msg){ 

    D& msgD = static_cast<D&>(msg); 

} 

msgD.xmsgD.y

와이어 와서 적절하게 재구성 :

는 시나리오가 될 것입니다. 그러나 receive 메서드를 수정하지 않고 재구성하는 방식을 변경하고 싶습니다. 이것이 가능한가?

+1

'Parent'를 수정할 수 없다면 컴파일러는'Parent :: operator Child &()'를 정의하지 않아야합니다. – Brian

+1

[\ static \ _cast \ * 연산자에 과부하가 걸릴 수 있습니까?] (https://stackoverflow.com/questions/8432651/is-it-possible-to-overload-the-static-cast- 연산자) –

+0

@ 브레인 - 네, 그게 실수 였어요 - 그에 따라 편집했습니다. 사실 부모님을 수정할 수 있습니다. – fatman

답변

0

을 감안할 때 클래스

struct Parent 
{ 
}; 

struct Child : Parent 
{ 
}; 

static_cast<Child&>는 사용자 정의 변환 기능을 사용하지 않습니다.

5.2.9 Static cast/2

B 클래스 타입 타입의 좌변 "CV1의 B"에서, 만약, D가 B로부터 유도 된 클래스 "CV2의 D에 대한 참조"형식으로 캐스팅 할 수있다 Cv2는 cv1과 동일한 cv-qualification 또는 cv1보다 큰 cv-qualification이며 B는 D의 가상 기본 클래스도 아니며 기본 클래스도 아니므로 유효한 표준 변환이 "D에서 포인터로"에서 "B 로의 포인터" 결과는 형식이 "cv2 D."

이고 그런 다음에 "otherwise"절이 있습니다.및 5.2.9 Static cast/5.

ChildParent의 하위 유형이므로 위의 4 절과 5 절은 적용되지 않습니다.

+0

그렇다면'child child3 = static_cast (부모);' 'Parent :: operator Child &() {...' – fatman

+2

@fatman, 나는 단지 답을 조금만 업데이트했다. 'static_cast '는'static_cast '와 다릅니다. –

+0

@R Sahu - 답장을 보내 주셔서 감사합니다. 바로 내가하고 싶은 일에 빛을 비추는 데 도움이되었습니다. 위의 질문에 세부 사항을 추가했습니다. – fatman