在接口中公开方法的优点是什么,但在实现中受到保护?

Pat*_*ick 3 c++ virtual interface access-specifier

在我的C++应用程序中,我有一个如下所示的界面:

class ICalculator
   {
   public:
      virtual double calculateValue(double d) = 0;
   };
Run Code Online (Sandbox Code Playgroud)

我有这个界面的实现,如下所示:

class MySpecificCalculator
   {
   public:
      virtual double calculateValue(double d);
   };
Run Code Online (Sandbox Code Playgroud)

现在我的同事抱怨这个并告诉我最好让calculateValue方法受到保护.这样,我们可以保证调用者总是通过接口传递,而不是通过直接实现.

这是正确的观察吗?是否真的更好地保护接口的实现?或者我们甚至不能把它私有化呢?

Chu*_*dad 10

你的同事是对的.

永远不要公开虚拟功能.

准则#1:更喜欢使用模板方法使接口非虚拟化.

准则#2:更喜欢将虚拟功能设为私有.

准则#3:只有派生类需要调用虚函数的基本实现时,才能使虚函数受到保护.

仅针对析构函数的特殊情况:

准则#4:基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.