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

未创建A类对象时setdata为何生效?B类对象如何访问A类私有变量?

问题解答

首先先看你提供的代码:

#include<iostream> 
using namespace std; 
class A { 
private: 
    int a,b; 
public: 
    void setdata(int x,int y){ 
        a=x;b=y; 
    } 
    void show_data(){ 
        cout<<a<<b; 
    } 
}; 
class B: public A{ 
}; 
main(){ 
    B b1; 
    b1.setdata(3,4); 
    b1.show_data(); 
}

针对你的两个疑问,我来逐一解释:

1. 未创建class A的对象时,setdata函数为何能正常工作?变量a和b是如何获得内存空间的?

其实你根本不需要单独创建A的对象——因为你实例化的b1是B类的对象,而B是公有继承自A的,这意味着b1的内存布局里,完整包含了A类的所有成员(包括私有成员a和b)。当你在main里创建b1的时候,操作系统已经为这个对象分配了足够的内存,其中就预留了a和b的存储位置。

而setdata是A类的公有成员函数,它被B类继承了下来。当你调用b1.setdata(3,4)时,这个函数的操作对象就是b1内部属于A类的那部分成员,本质上还是在操作b1自己的a和b,完全不需要额外创建A的对象。

2. 为何通过class B的对象b1可以访问class A的私有变量?

你并没有直接访问A的私有变量哦!这里的关键是:你是通过A类对外暴露的**公有成员函数setdata和show_data**来间接操作私有变量的。

私有成员的访问规则很明确:只有类自身的成员函数才能直接访问它的私有成员,子类对象和外部代码都不能直接读写私有成员。你这里的b1.setdata()是调用了继承来的公有函数,而这个函数属于A类,它天生就有权限访问A的私有成员a和b。如果试着直接写b1.a = 3,编译器立刻会报错,因为私有成员对外是完全不可见的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:38:53