考虑以下基类:
class Base
{
public:
virtual ~Base(void);
virtual void foo(void);
virtual void bar(void) = 0;
}
现在假设我知道给定的类应该是Base的派生类最多的类。我应该将这些功能声明为虚拟吗?最派生的类可以/将与Base一起使用多态。
例如,我应该使用MostDerived1
还是MostDerived2
?
class MostDerived1 : public Base
{
public:
~MostDerived1(void);
void foo(void);
void bar(void);
}
class MostDerived2 : public Base
{
public:
virtual ~MostDerived2(void);
virtual void foo(void);
virtual void bar(void);
}
我倾向于MostDerived1因为它最接近程序员的意图:我不希望MostDerived1的另一个子类与MostDerived1一起使用多态。
这种推理是否正确?除了显而易见的there could be a >0% chance MostDerived2 should be used polymorphically with any deriving classes (class OriginalAssumptionWrong : public MostDerived2)
?
请注意,MostDerived1
/ MostDerived2
可以与Base
一起使用。{/ p>
答案 0 :(得分:3)
向派生类添加虚拟不会改变其行为,MostDerived
和MostDerived2
具有完全相同的行为。
override
关键字也有助于此,假设它在您的平台上可用。
答案 1 :(得分:2)
你不能关闭 virtual
。从MostDerived1
或MostDerived2
派生的另一个类也可以覆盖任何virtual
函数,无论您是否在类层次结构中的某处省略virtual
关键字。
如果要强制执行其他类派生自MostDerived1
,请将其定义为
class MostDerived1 final : public Base
{
// ...
};
final
关键字也可用于单个virtual
成员函数,确保派生类不会覆盖该特定函数。
答案 2 :(得分:1)
一旦功能在层次结构的某个地方作为虚拟进行解析,它就永远是虚拟的 如果您使用 C ++ 11
,则可以使用final
或override