当我声明一个基类时,是应该将其中所有的函数都声明为虚函数,还是应该有一组虚函数和一组非虚函数,我确信后者不会被继承?
只有在派生类需要以不同的方式实现函数时,该函数才需要是虚函数。
例如:
class Base {
public:
void setI (int i) // No need for it to be virtual
{
m_i = i;
}
virtual ~Base () {} // Almost always a good idea
virtual bool isDerived1 () // Is overridden - so make it virtual
{
return false;
}
private:
int m_i;
};
class Derived1 : public Base {
public:
virtual ~Derived () {}
virtual bool isDerived1 () // Is overridden - so make it virtual
{
return true;
}
};
只有你打算和设计要被覆盖的函数才应该被声明为虚函数。将方法声明为虚函数在维护和性能方面都不是免费的(在我看来,维护成本更高)。
一旦一个方法被声明为虚函数,就会更难理解使用该方法的任何代码。因为你必须考虑在这种情况下N个方法调用会做什么,而不是考虑一个方法调用会做什么。N代表覆盖该方法的子类数量。
唯一的例外是析构函数。在任何想要派生的类中,析构函数都应该是虚函数。这是确保在释放时调用正确析构函数的唯一方法。
我倾向于只将我想要重写的内容设置为可重写的虚函数。如果我的初始假设关于我想要重写的内容是错误的,我会回去更改基类。
哦,如果你正在处理将被继承的东西,显然始终要使你的析构函数成为虚函数。
如果您正在创建一个基类(您确定有人派生该类),则可以执行以下操作:
接口函数通常应该是虚函数。提供固定功能的函数则不应该是虚函数。