首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么智能指针可以越权访问解决方案

2012-05-04 
为什么智能指针可以越权访问#include boost\shared_ptr.hpp#include iostreamclass A{public:protecte

为什么智能指针可以越权访问
#include <boost\shared_ptr.hpp>
#include <iostream>

class A 
{
public:  
protected:
virtual void sing()
{
std::cout<<"A";
}
protected: virtual ~A() {};

};

class B : public A 
{
public:  
virtual void sing() 
{  
std::cout << "B"; 
}
virtual ~B() {};
};


int main()
{
boost::shared_ptr<A> pa(new B());
pa->sing();

delete static_cast<B*>(pa.get());


  delete pa.get(); //这句提示错误error C2248: “A::~A”: 无法访问 protected 成员 (在“A”类中声明)
//但把这句注释掉却可以通过编译,可是main结束后shared_ptr<A>难道不是单纯的在析构函数中用delete 删除其内部维护的A *指针 这和 delete pa.get()有什么区别 ? 难道pa.get()返回的不是其内部维护的指针?
//为什么这个时候就可以无视A析构函数的protected访问权限?
return 0;
}

[解决办法]
不知道 boost::shared_ptr 具体怎么实现的,不过在 std::shared_ptr 实现里面(其实现严重参照boost::shared_ptr),最后的 delete ptr; 中的 ptr 类型是 B*。
你可以在 ~A 和 ~B 中分别输出不同的信息,会看到程序结束时两个析构函数依次调用。然后你可以把他们的 virtual 全删了,程序结束时你仍然能够看到他们的析构函数依次调用,原因是 shared_ptr 里面的指针类型为 B* (而非 A*),所以有无 virtual 不影响具体调用的析构函数。注意,这并不代表你设计程序的时候就可以泰然的不用 virtual destructor 了,这里只是举例用。
但是 shared_ptr::get 返回的是 A*,因为存在由 B* 到 A* 的隐式转换,所以 get 的返回没有问题,不过到你手里的时候,具体类型信息已经丢失了一部分,所以 delete pa.get(); 就不行了。

热点排行