如何让父类访问子类私有成员变量?C++继承问题求助
问题分析与解决方案
你的代码存在几个关键问题,既不符合题目要求,也违反了C++的封装规则:
- 父类
Human自行定义了public成员hoursSlept,但题目明确要求子类Student拥有私有hoursSlept变量,父类不应持有该成员。 - 子类的
setHoursSlept()实际修改的是从父类继承的hoursSlept,而非子类自身的私有成员,等于未使用题目要求的子类私有变量。 - 核心矛盾:C++中父类无法直接访问子类的私有成员,这是封装机制的基本约束,你的代码试图绕开这一点,但方向错误。
符合要求的正确实现思路
题目要求父类的sleep()输出子类的睡眠时间,同时子类的getHoursSlept()和hoursSlept必须是私有,最合理的方式是利用虚函数重写:让父类定义虚函数sleep(),子类重写该函数,在子类的sleep()中调用自身的私有getHoursSlept()获取睡眠时间,完成输出后退出。
修正后的代码
#include <iostream> #include <cstdlib> // 用于exit()函数 using namespace std; class Human { public: // 定义虚函数,允许子类重写 virtual void sleep() { // 基类默认行为:输出0小时后退出 cout << "I slept 0 hours" << endl; exit(0); } }; class Student : public Human { private: int hoursSlept = 0; // 子类私有变量,符合题目要求 // 子类私有成员函数,符合题目要求 int getHoursSlept() { return hoursSlept; } public: // 子类公有成员函数,供用户输入睡眠时间 void setHoursSlept() { cout << "enter hours slept" << endl; cin >> hoursSlept; } // 重写父类的sleep()函数 void sleep() override { cout << "I slept " << getHoursSlept() << " hours" << endl; exit(0); } }; int main() { Student test; test.setHoursSlept(); test.sleep(); // 调用子类重写后的sleep() }
补充说明
如果题目严格要求父类的sleep()必须是唯一的输出逻辑(不允许子类重写),可以通过友元机制让父类访问子类私有成员,但这种方式会破坏封装,一般不推荐:
#include <iostream> #include <cstdlib> using namespace std; // 前向声明子类 class Student; class Human { public: void sleep(Student& s); }; class Student : public Human { private: int hoursSlept = 0; int getHoursSlept() { return hoursSlept; } // 声明父类为友元,允许其访问私有成员 friend class Human; public: void setHoursSlept() { cout << "enter hours slept" << endl; cin >> hoursSlept; } }; void Human::sleep(Student& s) { cout << "I slept " << s.getHoursSlept() << " hours" << endl; exit(0); } int main() { Student test; test.setHoursSlept(); test.sleep(test); // 传递子类对象给父类的sleep() }
内容的提问来源于stack exchange,提问作者Ben Fox
相关产品推荐
相关产品推荐

