c++ - 安全地覆盖 C++ 虚函数

标签 c++ overriding virtual-functions

我有一个带有虚函数的基类,我想在派生类中重写该函数。有没有办法让编译器检查我在派生类中声明的函数是否实际上覆盖了基类中的函数?我想添加一些宏或其他东西,以确保我不会意外声明新函数,而不是覆盖旧函数。

举个例子:

class parent {
public:
  virtual void handle_event(int something) const {
    // boring default code
  }
};

class child : public parent {
public:
  virtual void handle_event(int something) {
    // new exciting code
  }
};

int main() {
  parent *p = new child();
  p->handle_event(1);
}

这里调用parent::handle_event()而不是child::handle_event(),因为child的方法错过了const声明因此声明了一个新方法。这也可能是函数名称的拼写错误或参数类型的一些细微差别。如果基类的接口(interface)发生更改并且某些派生类未更新以反射(reflect)更改,也很容易发生这种情况。

有什么办法可以避免这个问题,我可以告诉编译器或其他工具帮我检查吗?任何有用的编译器标志(最好是 g++)?您如何避免这些问题?

最佳答案

从 g++ 4.7 开始,它确实理解新的 C++11 override 关键字:

class child : public parent {
    public:
      // force handle_event to override a existing function in parent
      // error out if the function with the correct signature does not exist
      void handle_event(int something) override;
};

关于c++ - 安全地覆盖 C++ 虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/497630/

相关文章:

html - CSS 继承 - 为什么 'later' 声明被 'earlier' 声明覆盖?

java - Java 中的动态方法查找

java - 静态方法重新定义规则

c++ - 有关模板和虚拟功能的问题

c++ - 虚函数调用段错误

c++ - 如何在 CLion 中启用 C++11?

java - JNI/ Kotlin : Is it possible to pass delegate to JNI?

c++ - 具有两个可以采用多种不同类型的操作数的虚函数

c++ - “过早的 EOF”和 'Bad Character' 错误

c++ - 默认创建类 `final`还是给它们一个虚拟的析构函数?