C++ 私有和受保护的虚拟方法以及不使用公共虚拟方法是否有任何正当理由?正在谈论非虚拟接口(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
放在类定义的公共部分会有什么影响?