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

派生类调用基类get_data1为何返回基类私有成员值?

问题解析

你遇到的核心问题是对成员函数作用域和名字隐藏的理解偏差,具体拆解如下:

  • 基类的get_data1是public成员函数,会被派生类继承。但这个函数是在基类中定义的,它的作用域属于base类,所以函数内部的data1必然指向基类自身的私有成员,和派生类中同名的data1是完全独立的两个变量。
  • 派生类的data1只是和基类的成员同名,属于名字隐藏,但基类的成员函数无法访问派生类的成员(哪怕同名),所以调用get_data1时,返回的始终是基类初始化的5。
  • 你误以为派生类的成员函数调用get_data1会访问派生类的data1,但实际上get_data1根本不知道派生类有这个成员,它只认自己类里的data1。

如何让printData返回派生类的data1?

这里提供两种常见方案:

方案1:直接访问派生类的data1

既然printData是派生类的成员函数,它可以直接访问自己的data1,不需要通过基类的get_data1:

void printData()
{
    cout << data1 << endl; // 直接访问派生类的data1,输出3
}

方案2:在派生类中重写get_data1函数

如果需要通过get_data1接口返回派生类的成员,可以在派生类中定义同名函数,覆盖基类的版本:

class derived : public base
{
    int data1;
    public:
        derived()
        {
            data1=3;
        }
        // 重写get_data1,返回派生类的data1
        int get_data1()
        {
            return data1;
        }
        void printData()
        {
            cout << get_data1() << endl; // 此时调用的是派生类的get_data1,输出3
        }
};

额外说明:如果要同时访问基类的data1

如果需要在派生类中访问基类的data1,只能通过基类继承来的get_data1函数实现(因为基类data1是私有成员);如果基类将data1定义为protected权限,还可以用base::data1的作用域解析方式直接访问。

内容的提问来源于stack exchange,提问作者World Travellzzz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 08:15:43