为何派生类无法访问基类的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 classSharedPointer<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
相关产品推荐
相关产品推荐

