Почему я могу изменить личные данные базового класса из полученного класса - PullRequest
0 голосов
/ 26 мая 2019

Здесь класс d наследует класс b.Поскольку его видимость общедоступна, он может получить доступ к публичным членам класса b.

Когда я создаю newd, объект d.нет памяти, созданной для (члена с закрытыми данными класса b)

Но все же я могу получить и установить этот член, используя объект класса d.

Не могли бы вы объяснитьпочему это работает.Также, когда выделяется память для.

#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 ]

3 голосов
/ 26 мая 2019

Когда я создаю 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 член.

2 голосов
/ 26 мая 2019

Вы страдаете от недопонимания того, как работает определение доступа членов.

Ваше утверждение:

Когда я создаю newd, объект d. для a (личный член данных класса b) не создано памяти

неверно .

Спецификаторы доступа не имеют ничего общего с памятью или защитой памяти. Когда вы наследуете от класса, all должны быть созданы члены класса родительских классов. Это потому, что открытые и защищенные методы родительского класса все еще могут вызываться и могут обращаться к закрытым членам своего класса.

1 голос
/ 26 мая 2019

Приватный означает, что его можно изменить только методами, объявленными в том же классе. Ваш подкласс модифицирует это приватное поле с помощью открытого метода в этом классе. Другими словами, частные данные МОГУТ быть косвенно изменены функциями вне этого класса. Он просто не может быть изменен напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...