对纯虚函数实现的默认行为
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使用新的共同行为.
我读到 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使用新的共同行为.