为什么不能从派生类访问此受保护成员?[复制]

Why is this protected member not accessible from the derived class? [duplicate]

提问人:Zebrafish 提问时间:1/14/2023 最后编辑:Remy LebeauZebrafish 更新时间:1/14/2023 访问量:132

问:

我认为基类中受保护的成员可以从派生类访问,但事实并非如此:

template <typename T>
class SharedPointer
{
protected:
    explicit SharedPointer(T* const ptr) : ptr(ptr) {}

public:
    constexpr SharedPointer() : ptr(nullptr) { }

protected:
    T* ptr; 
};

template <typename T>
class WeakPointer : public SharedPointer<T>
{
protected:
    using parent_t = SharedPointer<T>;
    WeakPointer(T* ptr) : parent_t(ptr) {   }
public:
    WeakPointer(const WeakPointer& other)
    {
    }
    WeakPointer(WeakPointer&& other) = delete;
    WeakPointer(const SharedPointer<T>& other)
    {
        this->ptr = other.ptr;
    }    
};    

int main()
{
    SharedPointer<int> sp;
    WeakPointer<int> wp = sp;
}

我得到的错误是:

“SharedPointer<int>::p tr”: 无法访问类“SharedPointer<int>”中声明的受保护成员

这里有什么问题?

C++ 访问说明符

评论


答:

4赞 463035818_is_not_an_ai 1/14/2023 #1

有时不是那么亲密。从 cpppreference 上的 Access 说明符protected

类的受保护成员只能访问

  1. 给该班级的成员和朋友;
  2. 到该类的任何派生类的成员,但仅当访问受保护成员的对象的类是该派生类或该派生类的派生类时:

然后举个例子。

在您的例子中,2) 表示只能通过对象访问。如果它可以通过对 a 的引用进行访问,那么它就可以访问不同的派生类。这就是制定规则所要避免的。WeakPointer<T>ptrWeakPointer<T>ptrSharedPointer<T>ptr


在这种特殊情况下,您实际上不需要在派生类中访问:ptr

WeakPointer(const SharedPointer<T>& other) : SharedPointer<T>(other)
{}

现场演示

评论

0赞 Zebrafish 1/14/2023
处理这个问题的最佳方法是什么?
0赞 Nathan Pierson 1/14/2023
我想到的第一个想法是使用成员初始值设定项列表来复制构造基类。但它提出了一个问题,即从一开始就继承是否真的有意义。SharedPointer<T>WeakPointerSharedPointer
0赞 463035818_is_not_an_ai 1/14/2023
@NathanPierson我的想法,然后我就懒得想更多:P不确定它是否真的有意义。编译并且是正确的