编译时间检查方法是否定义为虚拟

时间:2012-03-27 13:08:12

标签: c++ compiler-construction

我正试图想出一种方法来检查派生类是否将基类的方法定义为“虚拟”。基本上我想要以下代码:

class A {
  virtual void vfoo() {}
  void foo() {}
  virtual ~A() {}
};

class B : public A {
  virtual void vfoo() {
    MAGIC_CHECK(m_pA->vfoo()); // succeed
    // code
    m_pA->vfoo();
    // code
  }
  virtual void foo() {
    MAGIC_CHECK(m_pA->foo()); // fail compilation because foo is not virtual!
    // code
    m_pA->foo();
    // code
  }
  A * m_pA;
};

问题是,我该如何实现这个MAGIC_CHECK? 一个解决方案是使用-Woverloaded-virtual compilation标志。 任何人都可以建议一个不涉及这面旗帜的解决方案吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

在C ++ 11中,可以在override的函数声明末尾添加class,如果函数没有覆盖任何内容,它将发出警告:

class B : public A {
  virtual void vfoo() override { //OK
  }
  virtual void foo() override { //error
  }
};

答案 1 :(得分:1)

在C ++ 03标准中,不可能检查方法是否声明为virtual
你可以关注,

  • 编码标准
  • 同行评审
  • 可能是一些静态分析工具