覆盖C ++中的方法

时间:2012-01-10 20:23:52

标签: c++ visual-c++ override

当我覆盖一个方法时,有时候我不小心忘记在C ++中调用超类的方法。

有什么方法可以帮助弄清楚我什么时候覆盖一个方法,这样我就不会忘记调用超类的方法了? (像Java的@Override之类的东西,除了C ++没有注释......)

3 个答案:

答案 0 :(得分:5)

一个建议是Non-Virtual Inferface Idiom。即,使您的公共方法非虚拟,并让它们调用派生类可以覆盖的私有或受保护的虚方法,以实现它们的特定行为。

如果您无法控制基类,则可以使用中间类:

class Foo // Don't control this one
{
  public:
    virtual void action();
};

class Bar : public Foo // Intermediate base class
{
  public:
    virtual void action()
    {
       doAction();
       Foo::action();
    }

  protected:
    virtual void doAction() = 0;
};

Bar导出您的课程并在每个课程上覆盖doAction()。如有必要,您甚至可以doBeforeAction()doAfterAction()

答案 1 :(得分:3)

关于Java的@Override,在C ++ 11中有一个直接的等价物,即override special identifier

可悲的是,@Overrideoverride都没有解决问题,因为:(a)它们是可选的; (b)调用基类的方法的责任仍由程序员负责。

此外,我不知道有任何广泛可用的方法可以解决这个问题(这是非常棘手的,特别是假设你没有必然想要调用基类的方法 - 如何知道机器?)。

答案 2 :(得分:0)

不幸的是,我不知道这样做的常用机制。

在C ++中,如果除了添加子功能之外还需要使用基类的功能,您应该查看模板方法模式。这样,通用逻辑总是存在于基类中,并且没有办法忘记执行它,并且只在子项中覆盖您需要更改的部分。