检测拼写错误的虚拟功能

时间:2010-02-09 21:33:24

标签: c++ virtual-functions misspelling

我不止一次被这个问题抓住了:

class A{
public:
  virtual ~A() {}
  virtual int longDescriptiveName(){ return 0; }
};

class B: public A{
public:
  virtual int longDescriptveName(){ return 1; } // Oops
};

如果函数是纯虚函数,编译器会捕获错误。但如果不是这可能是一个可怕的错误追踪。部分问题是函数名称可能太长。但我仍然想知道,有没有办法早点看到这些错误?

3 个答案:

答案 0 :(得分:2)

一种可能性是使用很少的纯虚函数:

virtual int longDescriptiveName() = 0
{
    return 0; 
}

这会强制派生类来覆盖它。然后,如果他们只想要这种行为,他们就可以单独调用基类实现。

此外,您需要确保您的继承层次结构是扁平的,而不是多层,这通常是好的,因为继承很脆弱而不会在层上堆积。

答案 1 :(得分:1)

如果您使用Microsoft Visual C ++ 2005或更高版本进行编译,则可以使用非标准扩展来编写:

virtual int longDescriptveName() override { return 1; }

编译器会抱怨。如果你也编译其他编译器,它可能很聪明,使#define,所以你可以控制行为。

答案 2 :(得分:0)

古老的问题,但是一个好的方法是在开始使用你的课程之前,要么正式地进行单元测试,要么更正式地进行测试。换句话说,请尽早检查:

A test_a;
B test_b;
A& poly_a = test_a;
A& poly_b = test_b;
assert(poly_a.longDescriptiveName() == 0);
assert(poly_b.longDescriptiveName() == 1);
在之前

,你要再写10,000行使用你的类的代码。