C++继承类One、Two定义咨询:双访问场景实现与代码正误验证
问题解答
一、你提供的case2代码正误判断
你写的这段代码不满足第二个条件,错误原因如下:
- 基类Two的
f、x声明为public权限,不仅One的成员可以访问,Two的对象、外部代码都可以直接访问这两个成员,不符合「只有类One的成员可访问所有数据成员」的限制 - 派生类One的
a、b是private权限,Two的成员完全无法访问这两个成员,不满足访问两类所有成员的要求。
二、满足第二个条件的正确实现
要求只有One的成员可以访问两个类的所有数据成员,核心要做到:
- 基类Two的成员设为private,同时声明One为Two的友元,保证只有One的成员可以访问Two的私有成员
- One私有继承Two,同时将自身的
a、b设为private,避免外部、类对象访问这些成员
正确代码如下:
#include <iostream> using namespace std; class Two{ // 声明One为友元,仅One成员可访问Two的私有成员 friend class One; private: float f; int x; }; // 私有继承Two,Two的成员在One中变为私有,外部无法访问 class One: private Two{ private: int a; char b; // 此处One的成员函数可以自由访问f、x、a、b四类成员 };
此时只有One的成员函数可以访问两个类的所有4个数据成员,Two的成员、两个类的对象、外部代码都无法访问全部成员,符合要求。
三、满足第一个条件的实现方案
要求两个类的对象都可访问两个类的所有数据成员,核心要做到所有数据成员都是public权限,One公有继承Two即可:
#include <iostream> using namespace std; class Two{ public: float f; int x; }; // 公有继承Two,Two的public成员在One中仍为public class One: public Two{ public: int a; char b; }; // 测试示例 int main(){ Two t; t.f = 1.5f; t.x = 10; // Two的对象可访问自身所有成员 One o; o.f = 2.5f; o.x = 20; o.a = 30; o.b = 'c'; // One的对象可访问两类共4个成员 return 0; }
此时Two的对象可以访问自身的f、x,One的对象可以访问自身的a、b以及继承来的f、x,满足第一个条件的要求。
内容的提问来源于stack exchange,提问作者Shreyas R
相关产品推荐
相关产品推荐

