未创建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
相关产品推荐
相关产品推荐

