我应该在派生类或基类的哪里声明朋友类?

时间:2019-02-13 21:35:05

标签: c++ inheritance polymorphism protected friend-class

我有一个派生类,该类在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 :(得分:2)

这是因为您的访问是通过IConnectSession接口sessionPtr进行的,并且您的友谊仅与派生类有关,而与基类无关。

答案 1 :(得分:2)

访问控制仅在编译时适用。在

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

即使sessionPtr设置为ConnectSession的实例,它的静态类型还是IConnectSession,这就是访问控制所针对的类型。由于SystemProcess不是IConnectSession的朋友,因此不允许访问HandlePriviledgedRequest()

您需要使其成为IConnectSession的朋友才能进行编译。