c++ - 为什么我能够从派生类修改基类的私有数据
问题描述
这里类 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;
}
解决方案
当我创建 newd 时,d 的一个对象。没有为 a(b 类的私有数据成员)创建内存
那是错的。Ad
是 a 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
。
推荐阅读
- search - 如果 grep 不匹配,则打印输入搜索字符串
- reactjs - 删除行时如何使多行TextInput缩小(React-Native)?
- testing - 如何在 @apollo/client 中使用代码参数模拟 ApolloError 来进行测试?
- python - 如何使用索引定义数组中的值作为索引来定义数组中的值
- php - 通过 supervisord 运行多次的 Laravel 调度程序
- c# - 如何将输入从表单插入到数据库?
- python - 有多个来源时移除一个来源值
- python - 如何减少python上图像的噪声?
- sbt - SBT 已经失去了使用 ctrl 字符格式化屏幕的能力。为什么?
- java - 为什么用户不能在一次迭代后输入另一个值?