C++ 什么';这个间接函数调用的优点是什么?

C++ 什么';这个间接函数调用的优点是什么?,c++,inheritance,function,abstract-class,virtual-functions,C++,Inheritance,Function,Abstract Class,Virtual Functions,我在库中找到以下代码: 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; }; 这通常被称为模板钩子对(又称热点),由Wolfgang Pre

我在库中找到以下代码:

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;
};

这通常被称为模板钩子对(又称热点),由Wolfgang Pree发明

看这个,


在调用时执行间接寻址的一个原因是,通常可以/必须在方法调用之前进行设置,而有些则在方法调用之后进行设置。在子类中,您只需要提供必要的行为,而无需进行设置和清理…

如果子类可以更改foo_u?)的定义,但消费者需要静态函数(为了效率)?或者对于委托模式?

这是模板模式。foo方法包含必须由所有子类执行的代码。当你这样看待它时,它更有意义:

class Bar {
public:
  bool foo(int i) {
   // Setup / initialization / error checking / input validation etc 
   // that must be done for all subclasses
   return foo_(i);
  }
private:
  virtual bool foo_(int i) = 0;
};
它比另一种方法更好,即试着记住分别调用每个子类中的公共代码。不可避免地,有人创建了一个子类,但忘记调用公共代码,导致了许多问题

这是(NVI)。赫伯·萨特(Herb Sutter)的那一页有很多细节。但是,你读到的内容有C++的FAQ Lite和.< NVI的主要优点是将接口与实现分离。基类可以实现泛型算法并将其呈现给世界,而其子类可以通过虚拟函数实现算法的细节。外部用户不会受到算法细节变化的影响,特别是当您以后决定添加预处理和后处理代码时

明显的缺点是您必须编写额外的代码。而且,
private
虚拟函数让很多人感到困惑。许多程序员错误地认为您无法覆盖它们。Habor萨特似乎喜欢<代码>私有< /Cudio>虚拟化,但是在实践中,遵循C++ FAQLite的推荐并使它们成为代码<保护的 >更有效。