我有一个派生类,它在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
中声明它们。为什么它不起作用以及如何解决它?谢谢。
那是因为你的访问是通过IConnectSession
界面,sessionPtr
,你的友谊只与派生类,而不是基类。
访问控制仅适用于编译时。在
SystemProcess::ApplyConfiguration(){
std::shared_ptr<IConnectSession> sessionPtr = new ConnectSession();
sessionPtr->HandlePriviledgedRequest(); // compile error
}
即使sessionPtr
被设置为ConnectSession
的一个实例,它的静态类型是IConnectSession
,这就是访问控制的对象。由于SystemProcess
不是IConnectSession
的朋友,因此不允许访问HandlePriviledgedRequest()
。
你需要让它成为IConnectSession
的朋友来进行编译。