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

如何让父类访问子类私有成员变量?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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:20:39