这里d类继承了b类。由于可见性是公开的,因此可以访问b类的公开成员。
创建newd时,是d的对象。没有为a(类b的私有数据成员)创建内存。
但是我仍然可以使用类d的对象来获取并设置该成员。
能否请您解释一下为什么有效。同样,何时为a分配了内存。
#include <iostream>
using namespace std;
class b{
int a;
public:
void get(){
cout << a << endl;
}
void set(int x){
a = x;
}
};
class d: public b{
int c;
public:
void getac(){
get();
cout << c << endl;
}
void setc(int x, int y){
set(x);
c = y;
}
};
int main() {
// your code goes here
d newd;
newd.setc(10, 20);
newd.getac();
newd.setc(12, 22);
newd.getac();
return 0;
}
答案 0 :(得分:3)
创建newd时,是d的对象。没有为a(类b的私有数据成员)创建内存。
那是错的。 d
是b
,因此它具有b
的所有成员,并且占用内存。 d
的总大小是b
的大小加上d
引入的新成员的大小。您创建的newd
对象确实具有a
成员(newd.a
。)它恰好是私有的,因此您无权直接访问它。这并不意味着它不存在。
您可以自己验证:
std::cout << "Size of b: " << sizeof(b)
<< ", size of d: " << sizeof(d) << '\n';
这将向您显示d
大于b
,因为它同时具有b::a
成员和 d::c
成员。< / p>
答案 1 :(得分:2)
您对成员访问范围的工作原理有误解。
您的声明:
创建newd时,是d的对象。没有为a(类b的私有数据成员)创建内存。
错误。
访问说明符与内存或内存保护无关。从类派生时,还必须创建父类的 all 类成员。也就是说,因为仍可以调用父类的公共方法和受保护的方法,并且可以访问其类的私有成员。
答案 2 :(得分:1)
私有意味着只能由在同一类中声明的方法才能对其进行更改。您的子类正在通过该类中的公共方法修改该私有字段。换句话说,私有数据可以被该类之外的函数间接修改。只是不能直接修改。