一个关于shared_ptr疑义

一个关于shared_ptr疑问
#include <iostream>
#include <smartptr.h>
using namespace std;
class A
{
public:
A() { cout << "A" << endl; }
protected:
virtual ~A() { cout << "~A" << endl; }
}; 

class B : public A
{
public:
B() : A() { cout << "B" << endl;}
~B() { cout << "~B" << endl; }
};
int main()
{
{
shared_ptr<A> p(new B()); //正常释放
}
shared_ptr<A> p(new B());
A* ap = p.get();
delete ap; // 编译错误
getchar();
}


 shared_ptr<A> 持有的是 class A 的指针,它想释放 new 出来的B对象,只能通过调用虚函数 virtual ~A(), 然而 virtual ~A() 是protected属性,无法调用。 shared_ptr<A> 也无法知道自己其实持有的是class B的指针, 那么它是如何做到正确的释放对象B的?
------解决方案--------------------
因为share_ptr内部的deletor实际保存的B*,而不是A*

template <class U> explicit shared_ptr (U* p);

------解决方案--------------------
因为他的shared_ptr的构造函数式一个函数模板,其模板形参并不同于类模板本身的模板形参。
也就是说也就是构造函数的实参可以传入其他类型,不一定是A,那么这样编译器会自动推倒出构造函数的实参是B,并且delete的时候,也会展开为delete (B*)obj;