对纯虚函数实现的默认行为

Default behaviour implemented to pure virtual function

我读到 Scott Meyers 建议虚函数的默认行为是:

class base
{
.....
protected:
   void vfDefault();
public:
   virtual void vf() = 0;
};

在派生中实现时class

class d1:public base
{
   virtual vf()
   {
       vfDefault();
       ....
   }
};

但也可以实现纯虚函数并将其用作默认行为:

class base
{
...
public:
   virtual void vf() = 0;
}
void base::vf()
{
 .....
};

在派生中实现时class

class d1:public base
{
   virtual vf()
   {
       base::vf();
       ....
   }
};

使用纯虚函数实现默认行为有什么缺点吗?

请注意,vfDefault()vf() 具有不同的访问说明符。每个人都可以调用base::vf(),包括直接调用基础实现。但是 base 中只有 children 可以调用 vfDefault()。因此,如果您将默认行为实现为单独的受保护函数,则可以确保外部代码无法直接调用它。

使用纯虚函数实现的另一个缺点是愚蠢的情况:

一开始可能有一个函数 vf 的默认行为。一段时间后,派生的 classes 可能会有新的共同行为。在那种情况下,除了放置新的受保护的公共函数和失去一致性之外别无选择。例如:

类 D1,D2,D3,D4继承class Base.Classes D1,D2,D3使用vfDefault然后出现classes D5和D6使用新的共同行为.