要检查功能的回归覆盖问题

时间:2013-10-30 01:18:19

标签: c++ polymorphism regression

编译器:GCC

在下面的代码中,所有3个Foo()的签名都是Foo(bool b),但有人更新了代码并忘记更改DeriveB::Foo。这通过编译。我们怎样才能防止这种错误呢?

class Base {
  virtual Foo(bool b, int i);
}

class DerivedA : public Base {
  Foo(bool b, int i);
}

class DerivedB : public Base {
  Foo(bool b);
}

3 个答案:

答案 0 :(得分:1)

override说明符可能就是您想要的。如果您在派生类的Foo声明中使用它,那么DerivedB::Foo会出现错误,因为它有不同的签名。

class Base {
  virtual Foo(bool b, int i);
}

class DerivedA : public Base {
  Foo(bool b, int i) override; // would be fine
}

class DerivedB : public Base {
  Foo(bool b) override; // gives an error
}

如果派生类中的函数与基类中的函数具有不同的签名,或者基类中的函数未声明virtual,则会出错。

没有办法强迫人们在派生类中使用覆盖说明符,所以你仍然要记得使用它。但是在更改功能签名时至少可能会发现错误。有关覆盖外观here的更多信息。

答案 1 :(得分:1)

在C ++ 11中,您可以使用override说明符,我相信它也是MSVC对C ++ 03代码的扩展。

如果您正在使用g ++或clang,那么将-Woverloaded-virtual传递给编译器就是我想到的。对于上面的示例,g ++报告:

so_virt.cc:2:16: warning: ‘virtual void Base::Foo(bool, int)’ was hidden [-Woverloaded-virtual]
   virtual void Foo(bool b, int i);
            ^
so_virt.cc:10:8: warning:   by ‘void DerivedB::Foo(bool)’ [-Woverloaded-virtual]
   void Foo(bool b);

答案 2 :(得分:0)

class Base {
 virtual Foo(bool b, int i) = 0;
}

class DerivedA : public Base {
 Foo(bool b, int i);
}

class DerivedB : public Base {
 Foo(bool b);
}

请注意我将=0添加到virtual Foo(bool b, int i) = 0

的方式