C++中的可视化重写方法

visual Overriding methods in C++

本文关键字:重写 方法 可视化 C++      更新时间:2023-10-16

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

有没有什么方法可以帮助我确定何时用重写方法,这样我就不会忘记调用超类的方法?(类似于Java的@Override,只是C++没有注释…)

一个建议是非虚拟推理习语。也就是说,使您的公共方法非虚拟,并让它们调用私有或受保护的虚拟方法,派生类可以覆盖这些方法来实现它们的特定行为。

如果你不能控制基类,你可以使用一个中间类:

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()

关于Java的@Override,在C++11中有一个直接等价物,即override特殊标识符。

遗憾的是,@Overrideoverride都不能解决问题,因为:(a)它们是可选的;(b) 调用基类的方法的责任仍然在于程序员。

此外,我不知道有什么广泛可用的方法可以解决这个问题(这很棘手,特别是考虑到你不一定想调用基类的方法——机器怎么知道?)。

不幸的是,我不知道有什么通用机制可以做到这一点。

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