【问题标题】:Becoming a friend through Inheritance C++通过继承 C++ 成为朋友
【发布时间】:2012-02-18 17:32:22
【问题描述】:
假设我有两个课程
Widget
^
|
Window
我还有另一个类应用程序:
定义如下
class Application
{
public:
...
private:
friend Widget;
};
这不会让 Window 访问受保护的应用程序和私有成员。有没有办法在不将 Window 和任何后续“Widget”声明为 Application 的朋友的情况下实现这一点?
【问题讨论】:
标签:
c++
inheritance
friend
【解决方案1】:
不,这是不可能的。
friendship 不可继承。
另外,friendship 表示两个实体之间有意的强耦合因此,如果您的设计确实需要如此强的耦合,请继续使用friends。 friendship 打破封装是一个被误解的概念。
【解决方案2】:
是否会在基类中定义一些方法来将调用转发到应用程序来完成这项工作?
例如。
class Application
{
public:
...
private:
friend Widget;
void PrivateMethod1();
};
class Widget
{
protected:
void ApplicationPrivateMethod1() { /* forward call to application.PrivateMethod1(); */ }
};
class Window : Widget
{
void SomeMethod()
{
// Access a friend method through the forwarding method in the base Widget class
ApplicationPrivateMethod1();
}
};
【解决方案3】:
如果继承的方法是唯一需要访问应用程序类的方法,那么您可以将各个方法声明为好友,并且只要窗口类不覆盖它们,它们就可以使用具有好友访问权限的方法。