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

时间:2016-10-22 11:07:52

标签: c++ pure-virtual

我读过Scott Meyers建议虚拟功能的默认行为是:

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

在派生类中实现

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

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

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

在派生类中实现

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

是否存在使用纯虚函数实现默认行为的任何不足之处?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

使用纯虚函数实现的另一个缺点是万无一失的情况:

一开始,函数vf可能有一个默认行为。一段时间后,有可能为派生类创建新的常见行为。在这种情况下,没有其他选择,除了新的受保护的共同功能和失去一致性。例如:

类D1,D2,D3,D4继承类Base.Classes D1,D2,D3使用vfDefault然后使用新的常见行为出现类D5和D6。