인프런 커뮤니티 질문&답변
5:15 예외클래스의 전달 과 캐치
작성
·
208
3
5:15 경에
예외클래스를 전달하고 캐치시에
catch(Exception & e ) -> Exception 클래스의 print 실행
catch(ArrayException & e)-> ArrayException 클래스의 print 실행
로 reference로 받고있는데 이러면 음 .. 강의에서 말씀하시는것처럼 ' 객체잘림 '이라기 보다는 '부모클래스의 print에 virtual이 붙지않아 ,다형성으로 구현할때 오버라이딩이 안됐다. '
라고 보는게 조금 더 맞지않나 싶은데 ( 12.9 객체잘림과 reference_wrapper 강의를 보면 객체잘림을 설명하실때 객체잘림은 refernce 나 포인터가 아닌 instance 끼리의 대입연산자(=) 를 할때 이루어지는것으로 보여지거든요) 이부분은 어떻게 생각하시나요?
퀴즈
C++ 예외 처리에서 throw된 예외 객체의 타입과 이를 받는 catch 블록의 매개변수 타입 관계는 어떠해야 할까요?
자동 형변환이 허용됩니다.
엄격하게 일치해야 합니다.
throw 타입은 catch 타입의 기본 클래스여야 합니다.
catch 타입은 throw 타입의 상위 포인터 타입이어야 합니다.
답변 2
2
두 가지 관점으로 보시는 것이 좋아보입니다.
다형성을 이용하려 했다. / 다형성을 이용하지 않으려 했다.
5:15~ 에 나오는 코드는 다형성을 이용하지 않으려 의도한 코드로,(Exception을 사용할 때 catch에 대해서 parent class는 child class도 잡아버리기 때문에 사용상에 주의가 필요함을 전달하기 위해)virtual을 의도적으로 붙이지 않은 것입니다.
객체잘림(object slicing)은 대입을 할 때만 일어나는 것은 아닙니다.
아래의 코드에서 long long을 child class에, int를 parent class 와 연관지어서 생각해보시면 도움이 될 것 같습니다.
#include <cstdio>
int main()
{
long long long_long= 2'122'474'873'647; // longlong range : -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
// int range: -2,147,483,648 to 2,147,483,647
// pointer를 이용한 경우
void *ptr = &long_long;
int *int_ptr = (int*)ptr;
printf("%lld %d\n", long_long, *int_ptr);
//2'122'474'873'647 = 11110111000101101010111000110001100101111
//761'029'423 = 101101010111000110001100101111
// =, 대입 연산자를 사용한 경우
int int_var = long_long;
printf("%d\n", int_var);
//761'029'423 = 101101010111000110001100101111
return 0;
}
0





