当我覆盖一个方法时,有时候我不小心忘记在C ++中调用超类的方法。
有什么方法可以帮助弄清楚我什么时候覆盖一个方法,这样我就不会忘记调用超类的方法了? (像Java的@Override
之类的东西,除了C ++没有注释......)
答案 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。
可悲的是,@Override
和override
都没有解决问题,因为:(a)它们是可选的; (b)调用基类的方法的责任仍由程序员负责。
此外,我不知道有任何广泛可用的方法可以解决这个问题(这是非常棘手的,特别是假设你没有必然想要调用基类的方法 - 如何知道机器?)。
答案 2 :(得分:0)
不幸的是,我不知道这样做的常用机制。
在C ++中,如果除了添加子功能之外还需要使用基类的功能,您应该查看模板方法模式。这样,通用逻辑总是存在于基类中,并且没有办法忘记执行它,并且只在子项中覆盖您需要更改的部分。