나는이 상황에 대한 완전한 답변을 찾기 위해 인터넷과이 스레드를 살펴 보았습니다. 나는 똑똑한 던지는 것을 읽었다. 객체에 대한 포인터는 매우 영리하지 않다. . 나는 왜 이 이런 일인지 이해하고 싶습니다. 나는 상황을 설명 할 것이다.스마트 포인터 및 예외 처리
class Foo
{
public: virtual ~Foo() {}
};
typedef tr1::shared_ptr<Foo> SPFoo;
class FooInherited: public Foo { };
typedef tr1::shared_ptr<FooInherited> SPFooInherited;
과의이 테스트 코드를 확인하자 :이 간단한 계층 구조를 가정 해 봅시다
int main(int argc, char** argv)
{
try
{
throw FooInherited();
}
catch(const Foo& f)
{
cout << "Foo& caught!" << endl;
}
try
{
throw SPFooInherited(new FooInherited());
}
catch(const SPFoo& f)
{
cout << "SPFoo& caught!" << endl;
}
return 0;
}
모든 컴파일하지만 런타임에 두 번째 시도 - 캐치 이 실행되지 않습니다. 누군가 왜 나를 설명 할 수 있을까요? 특별히 과 같은 코드 행이 런타임에 완벽하게 작동하는 경우
void function(const SPFoo& f)
{
}
...
SPFooInherited fi(new FooInherited());
function(fi);
나는 문제가 SPFooInherited가 SPFoo (FooInherited 푸에서 상속에도 불구하고)에서 상속하지 않는 것을 이해 않지만, 그것은 깊이 컴파일러/무엇인지 알고 싶습니다 함수 호출 예를 다르게하고 RTE 상황을 풀 수없는 예외를 잡을 때. catch 매개 변수가 함수 호출 매개 변수와 같지 않기 때문입니까? 왜 Foo &이 작동하고 SPFoo가 작동하지 않습니까?
대단히 감사합니다.
감사합니다. Iker.