首页 > 解决方案 > 为什么我能够从派生类修改基类的私有数据

问题描述

这里类 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;
}

标签: c++inheritance

解决方案


当我创建 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


推荐阅读