我应该在派生类或基类中声明朋友类?

问题描述 投票:0回答:2

我有一个派生类,它在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中声明它们。为什么它不起作用以及如何解决它?谢谢。

c++ inheritance polymorphism protected friend-class
2个回答
2
投票

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


2
投票

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

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

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

你需要让它成为IConnectSession的朋友来进行编译。

© www.soinside.com 2019 - 2024. All rights reserved.