大多数派生类中的虚拟成员函数?

时间:2013-07-18 23:03:18

标签: c++ polymorphism

考虑以下基类:

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)

之外,我还有什么理由可以选择MostDerived2吗?

请注意,MostDerived1 / MostDerived2可以与Base一起使用。{/ p>

3 个答案:

答案 0 :(得分:3)

向派生类添加虚拟不会改变其行为,MostDerivedMostDerived2具有完全相同的行为。

然而,它确实记录了你的意图。我会为此目的推荐它。 override关键字也有助于此,假设它在您的平台上可用。

答案 1 :(得分:2)

你不能关闭 virtual。从MostDerived1MostDerived2派生的另一个类也可以覆盖任何virtual函数,无论您是否在类层次结构中的某处省略virtual关键字。

如果要强制执行其他类派生自MostDerived1,请将其定义为

class MostDerived1 final : public Base
{
  // ...
};

final关键字也可用于单个virtual成员函数,确保派生类不会覆盖该特定函数。

答案 2 :(得分:1)

一旦功能在层次结构的某个地方作为虚拟进行解析,它就永远是虚拟的 如果您使用 C ++ 11

,则可以使用finaloverride