为什么我可以从已删除的类中修改基类的私有数据

时间:2019-05-26 09:02:17

标签: c++ inheritance

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

3 个答案:

答案 0 :(得分:3)

  

创建newd时,是d的对象。没有为a(类b的私有数据成员)创建内存。

那是错的。 db,因此它具有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)

私有意味着只能由在同一类中声明的方法才能对其进行更改。您的子类正在通过该类中的公共方法修改该私有字段。换句话说,私有数据可以被该类之外的函数间接修改。只是不能直接修改。