我在库中找到了以下代码:
class Bar { public: bool foo(int i) { return foo_(i); } private: virtual bool foo_(int i) = 0; };
现在我想知道:你为什么要使用这个间接?可能有任何理由说明为什么上述会比简单的替代方案更好:
class Bar { public: virtual bool foo(int i) = 0; };
Michael Kris.. 10
这是非虚拟接口成语(NVI).Herb Sutter的那篇页面有很多细节.但是,使用C++ FAQ Lite 在这里和这里所说的内容,可以缓解你所阅读的内容.
NVI的主要优点是将接口与实现分离.基类可以实现通用算法并将其呈现给世界,而其子类可以通过虚函数实现算法的细节.外部用户可以避免算法细节的变化,特别是如果您以后决定要添加预处理和后处理代码.
明显的缺点是你必须编写额外的代码.此外,private
虚拟功能让很多人感到困惑.许多程序员错误地认为你无法覆盖它们.Herb Sutter似乎喜欢private
虚拟,但恕我直言,它在实践中更有效地遵循C++ FAQ Lite的建议并制作它们protected
.
这是非虚拟接口成语(NVI).Herb Sutter的那篇页面有很多细节.但是,使用C++ FAQ Lite 在这里和这里所说的内容,可以缓解你所阅读的内容.
NVI的主要优点是将接口与实现分离.基类可以实现通用算法并将其呈现给世界,而其子类可以通过虚函数实现算法的细节.外部用户可以避免算法细节的变化,特别是如果您以后决定要添加预处理和后处理代码.
明显的缺点是你必须编写额外的代码.此外,private
虚拟功能让很多人感到困惑.许多程序员错误地认为你无法覆盖它们.Herb Sutter似乎喜欢private
虚拟,但恕我直言,它在实践中更有效地遵循C++ FAQ Lite的建议并制作它们protected
.