c++ - 我应该在派生类或基类中的哪个位置声明朋友类?
问题描述
我有一个在 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
. 为什么它不起作用以及如何解决它?谢谢。
解决方案
那是因为你的访问是通过IConnectSession
接口,sessionPtr
而你的友谊只与派生类,而不是基类。
推荐阅读
- react-native - 关于 React Native Maps 和 Markers 的问题
- java - Java Postgis如何将jts转换为坐标
- compilation - 如何将 DPDK 项目扫描为
- ruby - 带有 RSPEC 的 VCR 抛出 JSON 文本必须至少包含两个八位字节
- php - 当 prepare() 失败时 mySql 没有返回错误信息
- django - 如何在没有 is_superuser 属性的情况下访问 Django 管理页面?
- flutter - 布尔表达式不能为空 | 当我将 timerState 切换为“true”时出现此错误。“False”没有给出错误,出了什么问题?
- youtube - 如何提取按日期发布的 YouTube 视频数量(包含特定关键字)?
- elasticsearch - 如何检查 ElasticSearch 黄色状态的原因
- css - 修复对齐项目“中心”输入/按钮不匹配