【问题标题】:Detecting a misspelt virtual function检测拼写错误的虚函数
【发布时间】:2010-02-09 21:33:23
【问题描述】:

我不止一次被这个问题所困扰:

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

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

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

【问题讨论】:

    标签: c++ virtual-functions misspelling


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      如果您使用 Microsoft Visual C++ 2005 或更高版本进行编译,则有一个非标准扩展允许您编写:

      virtual int longDescriptveName() override { return 1; }
      

      编译器会抱怨。如果您还使用其他编译器进行编译,那么制作 #define 可能很聪明,这样您就可以控制行为。

      【讨论】:

      • 这是有用的扩展!但我使用 gcc。
      【解决方案3】:

      老死灵的问题,但一种好​​方法是在开始使用类之前尽早进行测试,无论是正式的单元测试,还是更非正式的测试。换句话说,尽早检查:

      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 多行使用您的类的代码之前。

      【讨论】:

        猜你喜欢
        • 2010-10-16
        • 2015-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多