C ++界面设计:私有虚拟

时间:2016-10-07 03:47:01

标签: c++ inheritance interface class-design virtual-functions

假设我有一个接口类A(只有纯虚函数的类)。另外,我有一个具体的类B,它拥有一个指向A的弱指针,并在其上调用方法。

A类和B类之间存在强耦合。基本上我希望只有B类才能在A类上调用方法。

在A,私有(纯)虚拟上声明所有方法并使B类成为朋友是否有意义。实现A的类可以自由地改变它们作为继承A的一部分实现的函数的访问。这似乎适用于用例,但我以前没有看过它。

1 个答案:

答案 0 :(得分:0)

这是有意义的,它解决了一个设计问题,但它引发了另一个问题(你可能会认为是次要的或不是)。

在Sutter和Alexandrescu的C++ Coding Standards中,有一条准则39. Consider making virtual functions nonpublic, and public functions nonvirtual。这是有道理的。说你有

class interface {
public:
    virtual void bar();
};

然后你意识到所有bar都有一些共同点:也许你想要验证传递给它们的参数(如果它们接受参数),或者记录对所有class interface { public: void bar() { bar_(); } protected: virtual void bar_(); }; 的调用。因此,指南是将其拆分为

friend

即,一种调用非公共虚拟方法的公共非虚方法。公共站点是虚拟站点的唯一网关。

问题是,在您引入bar_之前,这是唯一的网关。然后,你没有控制权,外部类可以直接调用foo,绕过它。

在您的情况下,您可以考虑以下因素:

假设要授予访问权限的类为interface,接口类为interface_accessor。写另一个类class foo; class interface; class interface_accessor { private: static void bar(interface &i); friend class foo; }; ,它将成为网关:

interface_accessor

请注意,foointerface的朋友。

现在,让interface_accessor成为foo的朋友,而不是class interface { private: virtual void bar_() {} friend class interface_accessor; }; 的朋友:

interface_accessor

最后,实施void interface_accessor::bar(interface &i) { i.bar_(); }

data
相关问题