class A {
protected:
 A(){}
 virtual ~A()=0;
};

A::~A(){}

class BFactory;
class B {
private:
 B(){}
 virtual ~B(){}
 friend class BFactory;
};

class BFactory {
public:
 BFactory(){};
 ~BFactory(){};
 std::tr1::shared_ptr<A> CreateB(){return std::tr1::shared_ptr<B>(new B());}
};

こんな感じでshared_ptrをBFactoryから返そうとしたら、
gcc43.4で「virtual B::~B()’ is private(privateメンバーにアクセスできない)」とのエラーが出ます。
クラスBの直接deleteを防ぎ、かつshared_ptrでメモリ管理の煩雑さを防ぐ方法はないのでしょうか?