Почему объект производного класса d не может вызвать защищенную функцию-член базы классов? - PullRequest
0 голосов
/ 02 ноября 2019

Здесь объект производного класса d не может вызвать защищенную функцию-член базы классов.

#include <iostream>

using namespace std;

class base
{
protected:
    int i,j;
    void setij(int a,int b)
    {
        i=a;
        j=b;
    }
    void showij()
    {
        cout<<i<<" "<<j<<endl;
    }
};

class derived : protected base
{
    int k;
public:
    void show()
    {
        base b;
        b.setij(10,20);
        b.showij();
    }

};

int main()
{
    base b;
    derived d;
    d.setij(3,4);
    d.showij();
    d.show();
    return 0;
}

Я ожидаю, что на выходе будет 10 20, но компилятор показывает ошибку.

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Вы использовали protected наследование. Проблема не в том, что производный не может получить доступ к защищенным методам базы, но проблема в том, что вы не можете получить доступ к базовым методам извне derived.

Если вы не знаете, что означает защищенное наследование, вы можете прочитать, например, здесь Разница между частным, публичным и защищенным наследованием

Я сомневаюсь, что вы хотели использовать protected наследство здесь (с чего бы вы?). Измените его на public наследование, и ваш код должен быть в порядке:

class derived : public base ...

PS: в сообщении об ошибке должно было быть указано, что является реальной проблемой (хотя и загадочно). Пожалуйста, в следующий раз включите его в вопрос. Если вы не можете этого понять, вероятно, другие поймут.

0 голосов
/ 02 ноября 2019

С этим кодом неправильно лот . Даже если вы измените наследование класса derived с protected на public, все еще существуют следующие проблемы:

  1. В классе derived, операторы b.setij(10,20); и b.showij(); будет по-прежнему генерировать ошибки компилятора. См. Почему производный класс не может вызывать защищенную функцию-член в этом коде? для хорошего объяснения. Краткое объяснение: метод может вызывать защищенный метод только в базовом классе для объекта, для которого он был первоначально вызван.

  2. Функция main не сможет вызвать d.setij(3,4); или d.showij();, потому что это защищенные методы в классе base.

Это должно выполняться:

#include <iostream>

using namespace std;

class base
{
protected:
    int i,j;
    void setij(int a,int b)
    {
        i=a;
        j=b;
    }
    void showij()
    {
        cout<<i<<" "<<j<<endl;
    }
};

class derived : public base
{
    int k;
public:
    void show()
    {
        this->setij(10,20);
        this->showij();
    }

};

int main()
{
    derived d;
    d.show();
    return 0;
}
...