在C++中,一个编码器不知道其他编码器是否会继承他的类。 他应该使那个类中的每个函数都是虚拟的吗? 有什么缺点吗? 还是根本就不能接受?
在C++中,只有当您想要多态地使用一个类时,才应该使它成为可继承的类。 在C++中处理多态对象的方式与处理其他对象的方式非常不同。 您不倾向于将多态类放在堆栈上,或者通过值传递它们或从函数返回它们,因为这可能导致切片。 多态对象往往是堆分配的,通过指针或引用传递和返回的,等等。
如果您设计了一个不可继承的类,然后又从它继承,就会引起各种各样的问题。 如果析构函数没有标记为virtual,则无法通过基类指针删除对象而不导致未定义的行为。 如果没有标记为virtual
的成员函数,则无法在派生类中重写它们。
作为C++中的一般规则,当您设计类时,确定您是否希望继承它。 如果这样做,请将适当的函数标记为virtual
,并给它一个virtual
析构函数。 您也可以禁用复制赋值运算符以避免切片。 同样,如果希望类不可继承,就不要给它任何这些函数。 在大多数情况下,从一个不是为继承而设计的类继承是一个逻辑错误,并且大多数情况下,您想要这样做,您通常可以使用组合而不是继承来实现这种效果。
不,通常不是。
非虚函数强制执行类不变行为。 而虚函数则不需要。 因此,编写基类的人应该考虑特定函数的行为是否是/应该是类不变的。
虽然一个设计允许所有行为在派生类中变化是可能的,但这是相当不寻常的。 这通常是一个很好的线索,即编写类的人要么没有过多地考虑它的设计,要么缺乏做出决定的决心。
在C++中,您可以将类设计为值类型或多态类型。 例如,请参阅C++FAQ。