Вызов родительских методов и доступ к закрытой переменной в родительском классе? - PullRequest
4 голосов
/ 24 октября 2010

Я пытаюсь заставить работать следующий код, но не могу найти достаточно хорошей документации о том, как C ++ обрабатывает публичное и частное наследование, чтобы позволить мне делать то, что я хочу.Если кто-то может объяснить, почему я не могу получить доступ к Parent::setSize(int) или Parent::size с использованием частного наследования или Parent::size с использованием открытого наследования.Чтобы решить эту проблему, мне нужен метод getSize() и setSize() в Parent?

class Parent {
    private:
        int size;

    public:
        void setSize(int s);
};

void Parent::setSize(int s) {
    size = s;
}

class Child : private Parent {
    private:
        int c;

    public:
        void print();
};

void Child::print() {
    cout << size << endl;
}

int main() {
    Child child;

    child.setSize(4);

    child.print();

    return 0;
}

Ответы [ 4 ]

14 голосов
/ 24 октября 2010

Изменить Parent на:

protected: int size;

Если вы хотите получить доступ к члену size из производного класса, но не из-за пределов класса, тогда вы хотите protected.

Измените Child на:

class Child: public Parent

Когда вы говорите class Child: private Parent, вы говорите, что должно быть секретом, что Child является Родителем.Ваш код main дает понять, что вы хотите, чтобы Child управлялся как родитель, поэтому это должно быть публичное наследие.

5 голосов
/ 24 октября 2010

Когда вы используете частное наследование, все открытые и защищенные члены базового класса становятся частными в производном классе.В вашем примере setSize становится приватным в Child, поэтому вы не можете вызвать его с main.

Кроме того, size уже является приватным в Parent.После объявления закрытым член всегда остается закрытым для базового класса независимо от типа наследования.

0 голосов
/ 26 января 2017
#include <iostream>
using namespace std;


class Parent {
private:
    int size;

public:
    void setSize(int s);

    int fun()  //member function from base class to access the protected variable 
    {
        return size;
    }
};

void Parent::setSize(int s) {
size = s;
}

class Child : private Parent {
private:
    int c;

public:
    void print();


    using Parent::setSize; //new code line
    using Parent::fun;     //new code line
};

void Child::print() {
    cout << fun() << endl;
}

int main() {
    Child child;

    child.setSize(4);

    child.print();

    return 0;
}
0 голосов
/ 24 октября 2010

Вы не можете получить доступ к личным данным членов других классов.Если вы хотите получить доступ к закрытым атрибутам суперкласса, вы должны сделать это через общедоступные или защищенные средства доступа.Что касается остального, см. @ 1001 * ответ @ casablanca .

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