派生类访问基类结构体成员遇权限问题,请求技术协助
问题根源分析
你遇到的报错其实不是因为结构体A的total成员私有(它明明是public的!),而是因为基类MyClass中的var1是private成员。根据C++的访问控制规则:基类的私有成员只能被基类本身访问,哪怕是派生类也没有直接访问的权限——你之前给A加友元完全是找错了方向,因为A的成员本来就是公开的,根本不需要友元来授权访问。
解决方案
这里有几种符合C++封装原则的解决办法,按推荐程度排序:
1. 把基类中的var1改为protected访问权限
protected成员允许基类本身和它的派生类访问,同时对外保持私有,这是最直接的方案:
struct A{ public : int total; // 本来就是public,无需修改 // some stuff }; class MyClass{ // [Base] class protected: // 把private改成protected A var1; }; class Derv1 : public MyClass{ // 派生自基类 private: // some stuff public: int display_var1(){ return var1.total; // 现在可以正常访问了 } };
2. 在基类中提供公共的Getter方法
如果你想保持var1的private属性(更严格的封装),可以在基类里写一个专门的方法来返回var1.total的值:
struct A{ public : int total; // some stuff }; class MyClass{ // [Base] class private: A var1; public: // 提供Getter方法,对外暴露需要的成员值 int getVar1Total() const { return var1.total; } }; class Derv1 : public MyClass{ private: // some stuff public: int display_var1(){ return getVar1Total(); // 通过基类的公共方法访问 } };
3. 将派生类声明为基类的友元(不推荐)
这种方法会破坏封装性,因为友元关系会绕过正常的访问控制规则,除非特殊情况不建议使用:
struct A{ public : int total; // some stuff }; class MyClass{ // [Base] class private: A var1; // 声明Derv1为友元,允许它访问私有成员 friend class Derv1; }; class Derv1 : public MyClass{ private: // some stuff public: int display_var1(){ return var1.total; // 现在可以访问了 } };
内容的提问来源于stack exchange,提问作者Robert Hamm
相关产品推荐
相关产品推荐

