Где в производном или базовом классе я должен объявить класс друга? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть производный класс, который реализует интерфейс (абстрактный класс) в C ++.Этот интерфейс имеет несколько защищенных функций, реализация которых определена в производном классе.

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

Например: у меня есть класс ConnectSession, реализующий IConnectSession.И внешний класс с именем SystemProcess, который хочет получить доступ к защищенной функции-члену HandlePriviledgedRequest.

В IConnectSession.h

class IConnectSession{
protected:
    virtual void HandlePriviledgedRequest() = 0;
}

В ConnectSession.h

class ConnectSession : public IConnectSession{
protected:
    void HandlePriviledgedRequest() override {/* func definition */}
    friend class SystemProcess;
}

В классе друга я пытаюсь получить доступ HandlePriviledgedRequest()

SystemProcess.cpp

SystemProcess::ApplyConfiguration(){
    std::shared_ptr<IConnectSession> sessionPtr = new ConnectSession();
    sessionPtr->HandlePriviledgedRequest(); // compile error
}

Выдает ошибку компилятора, говорящую, что я не могу получить доступ к защищенным членам, даже если я уже объявил SystemProcessкак друг.Поскольку объявления друзей не наследуются, я особенно объявляю их в ConnectSession.Почему не работает и как это исправить?Спасибо.

Ответы [ 2 ]

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

Контроль доступа - это то, что применяется только во время компиляции.В

SystemProcess::ApplyConfiguration(){
    std::shared_ptr<IConnectSession> sessionPtr = new ConnectSession();
    sessionPtr->HandlePriviledgedRequest(); // compile error
}

, хотя sessionPtr устанавливается для экземпляра ConnectSession, его статический тип равен IConnectSession, и именно с этим работает контроль доступа.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 101 * * * * * * * * * * * *

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

Это потому, что ваш доступ через интерфейс IConnectSession, sessionPtr, и ваша дружба только с производным классом, а не с базовым классом.

...