我读过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();
....
}
};
是否存在使用纯虚函数实现默认行为的任何不足之处?
答案 0 :(得分:2)
请注意,vfDefault()
和vf()
具有不同的访问说明符。每个人都可以调用base::vf()
,包括直接调用基本实现。但只有base
的孩子可以致电vfDefault()
。因此,如果您将默认行为实现为单独的受保护功能,则可以确保外部代码无法直接调用它。
答案 1 :(得分:0)
使用纯虚函数实现的另一个缺点是万无一失的情况:
一开始,函数vf可能有一个默认行为。一段时间后,有可能为派生类创建新的常见行为。在这种情况下,没有其他选择,除了新的受保护的共同功能和失去一致性。例如:
类D1,D2,D3,D4继承类Base.Classes D1,D2,D3使用vfDefault然后使用新的常见行为出现类D5和D6。