【发布时间】:2015-12-12 02:02:25
【问题描述】:
C++ private and protected virtual method 和 Is there any valid reason for not using public virtual methods? 正在讨论非虚拟接口 (NVI) 和非公共虚拟功能及其共生关系。 Scott Meyers 在 Effective C++ 中也说过
有时虚函数甚至必须是公开的,但 NVI 习语不能真正应用。
我没有看到为什么 NVI 要求实现特定的虚拟功能是非公开的?从 Herb Sutter 的文章 Virtuality 中,它说这是一个很好的做法,例如,将公共(客户端)接口与实现细节(非公共接口)分开是很好的。我想知道的是,如果将此类虚函数声明为公共,我是否错过了任何语义上阻止应用 NVI 的语言功能?
例如:
class Engine
{
public:
void SetState( int var, bool val );
{ SetStateBool( int var, bool val ); }
void SetState( int var, int val );
{ SetStateInt( int var, int val ); }
private:
virtual void SetStateBool(int var, bool val ) = 0;
virtual void SetStateInt(int var, int val ) = 0;
};
如果我将SetStateBool 和SetStateInt 放在类定义的公共部分会有什么影响?
【问题讨论】:
-
它可以防止客户依赖他们,仅此而已
-
如果是公开的,就是接口的一部分,所以接口毕竟不是非虚拟的……
-
@T.C.不错哦!它违背了名称的 NV 部分......
-
你是在问fpr这个成语的原因,还是为什么NVI暗示虚函数是非虚函数?
-
应该是。我不明白你的困惑。如果您有公共虚拟功能,那么您将不再有非虚拟接口,但该语言中没有任何内容要求您首先遵循 NVI Isom。与所有成语一样,这只是一个建议。
标签: c++ idioms non-virtual-interface