0

我有一个在 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()

系统进程.cpp

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

它从编译器中抛出一个错误,说即使我已经声明SystemProcess为朋友,我也无法访问受保护的成员。由于没有继承友元声明,因此我特别在ConnectSession. 为什么它不起作用以及如何解决它?谢谢。

4

2 回答 2

2

那是因为你的访问是通过IConnectSession接口,sessionPtr而你的友谊只与派生类,而不是基类。

于 2019-02-13T21:38:43.460 回答
2

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

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

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

你需要让它成为它的朋友IConnectSession才能编译它。

于 2019-02-13T21:39:18.427 回答