Интеллектуальные указатели и Обработка исключений

я просмотрел Интернет и этот поток, ища полное ответ этой ситуации я сталкиваюсь. Я считал тот умный бросок указатели на объекты не очень умны. Я просто хочу понять почему этот случай. Я объясню ситуацию. Позволить вообразить это простая иерархия:

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 наследовался от Foo), но Он глубоко хотел бы знать то, что является выполнением compiler/RTE по-другому по сравнению с примером вызова функции при ловле исключения, чтобы не смочь решить de ситуацию. Это, потому что параметр выгоды не является тем же как параметром вызова функции? Почему работы Foo& и SPFoo не делают?

Заранее большое спасибо.

С уважением, Iker.

8
задан Iker Jamardo 5 September 2011 в 14:17
поделиться