c++ - 为什么 shared_ptr 可以访问 ingoring "protected access right"

标签 c++ shared-ptr

我用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/

相关文章:

c++ - 使用 Prim 算法的六角形迷宫

C++ & 升压 : I'm trying to find an example TCP program with a server that accepts connections from multiple clients

c++ - 池容器的最佳数据结构是什么?

c++ - 如何在允许运行时调用的同时保证算法的编译时评估

C++ printf 字段宽度说明符 ‘.*’ 需要 int 而不是 size_t

c++ - 通过 shared_ptr 共享类内存

c++ - 用于无锁单链表的原子 shared_ptr

C++ 自动检测 shared_ptr 与 NULL 比较的位置

c++ - GMock StrictMock无趣的函数调用不会通过测试

C++11 - 如何将 priority_queue 与共享指针 vector 一起使用?