C++ です. 以下のような擬似コードについて教えていただきたいと思います。

class A : public B {}
class B : public C {}

void func( boost::shared_ptr<C> val ) {
...
}

void main() {
boost::shared_ptr<C> a( new A() );
boost::shared_ptr<C> b( new B() );
func( a );
func( b );
}

は問題ありませんが,
=================================================
void main() {
boost::shared_ptr<A> a( new A() );
boost::shared_ptr<B> b( new B() );
func( a );
func( b );
}

は型が違うとコンパイルが通りませんでした.
これを問題のないものにするにはどうしたらよいでしょうか?