我用shared_ptr做了一些测试,我想不出下面的问题。我刚开始学习boost库。有谁能告诉我原因吗?
#include <boost\shared_ptr.hpp>
#include <iostream>
class A
{
public:
virtual void sing()
{
std::cout<<"A";
}
protected: virtual ~A() {};
};
class B : public A
{
public:
virtual void sing()
{
std::cout << "B";
}
virtual ~B() {};
};
int foo()
{
boost::shared_ptr<A> pa(new B());
pa->sing();
delete static_cast<B*>(pa.get());
delete pa.get(); //this line has a problem error C2248: “A::~A”: can't access protected memmber(declared in class“A")
return 0;
}
int main()
{
foo();
return 0;
}
但是注释掉那行就可以编译了。当然,这并不意味着 shared_ptr 会删除主函数内部维护的指针,就像我所做的那样。 pa.get()
返回的指针和内部维护的指针有区别吗?
最佳答案
我相信 delete
是在销毁 shared_ptr
期间根据传递给构造函数的指针类型调用的。看看这里的构造函数:
http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm#constructors
因此,当您的 pa
超出范围时,将调用 B::~B( )
而不是所包含类型的析构函数 - A::~A
(这是不可能的,因为它被声明为 protected
)。
关于c++ - 为什么 shared_ptr 可以访问 ingoring "protected access right",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10396917/