VC++2005です。

class SuperFoo {};
class Foo : public SuperFoo {};
こんな感じのクラスがあって、

void DoSomething(SuperFoo *p);
みたいな関数があったとすると、

DoSomething(new Foo);
のようにできますよね。

void DoSomething2(shared_ptr<SuperFoo> p);
しかしこんな関数だと、

DoSomething(shared_ptr<Foo>(new Foo));
ってやるとエラーになるのでstatic_pointer_castしてやらんといけないのですが、
親クラスのキャストはいちいちやりたくないです。

これってこういうものなのでしょうか?