Доступ к защищенному члену данных друга суперкласса в функции подклассов - PullRequest
0 голосов
/ 22 февраля 2019

Есть три класса, A, B, C;Класс A дружит с B, B имеет защищенный член данных.Класс C публично наследуется от класса A. Могу ли я получить доступ к этим защищенным членам данных B, инициализировав объект B в функции C?

Если нет, то как мне получить доступ к значениям B в функциях C?

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

friend НЕ наследуются.
Точно так же friend из friend НЕ friend.

В качестве альтернативы идиома пароля может помочь вваш случай:

class B;

class A
{
public:
    struct Key{
        friend class B; // no longer in class A.
    private:
        Key() = default;
        Key(const Key&) = default;
    };
    // ...
};

class C : public A
{
private:
    void secret(Key /*, ...*/) { /*..*/ }
};

class B
{
public:
    void foo(C& c) {
         c.secret(A::Key{}); // Access C private thanks to "private" key from A.
    }
};
0 голосов
/ 22 февраля 2019

Вы не можете получить доступ к защищенным членам B напрямую в C, но вы можете ввести защищенный метод в A, который получает / устанавливает защищенный член в B;поскольку C получен из A, вы можете получить доступ к защищенным методам get / set в A из C, см. пример ниже.Вероятно, лучше всего подумать об общем дизайне.

class A
{
protected:
    int getValueOfB(B& b) { return b.protectedValue; }
    void setValueInB(B& b, int value) { b.protectedValue = value; }
};

class C
{
    void doSomething()
    {
       B b;
       setValueInB(b, 1);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...