You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何派生类无法访问基类的protected成员?

问题:派生类为何无法访问基类对象的protected成员?

我原本以为基类的protected成员可以被派生类任意访问,但实际编译报错。代码如下:

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>::ptr: cannot access protected member declared in class SharedPointer<int>

请问问题出在哪里?


问题根源

C++中protected成员的访问规则并非“派生类可以访问所有基类对象的protected成员”,而是派生类仅能访问自身继承而来的基类子对象的protected成员,无法访问其他独立存在的基类对象的protected成员。

在你的代码中,WeakPointer的构造函数WeakPointer(const SharedPointer<T>& other)里,other是一个独立的SharedPointer对象,并非当前WeakPointer对象继承的基类部分。此时直接访问other.ptr违反了protected成员的访问权限规则,因此编译器报错。


修正方案

方案1:给基类添加protected访问接口

在SharedPointer中添加一个protected成员函数,用于获取ptr,这样派生类就能合法调用该接口来获取其他基类对象的指针:

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

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

protected:
    T* ptr;
    // 添加protected访问接口
    T* get_ptr() const { return ptr; }
};

然后修改WeakPointer的构造函数:

WeakPointer(const SharedPointer<T>& other)
{
    this->ptr = other.get_ptr();
}

方案2:将派生类声明为基类的友元

如果需要直接访问ptr,可以在SharedPointer中声明WeakPointer为友元,但这种方式会破坏类的封装性,需谨慎使用:

template <typename T>
class SharedPointer
{
    // 声明友元
    template <typename U>
    friend class WeakPointer;

protected:
    explicit SharedPointer(T* const ptr) : ptr(ptr) {}

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

protected:
    T* ptr; 
};

内容的提问来源于stack exchange,提问作者Zebrafish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:15:31