在C++ 11中同时使用virtual和override关键字有什么微妙之处吗?

Mar*_*ark 21 c++ c++11

在C++中同时使用virtualoverride使用函数是危险的吗?那是否会让你因重载而产生歧义?

显然,virtual必须在基类中使用,这将是愚蠢的,不使用override派生类,但它实际上是有问题的使用virtual override在派生类?

试图确定这是一个风格或正确的问题.

例:

class Widget {
  virtual void transmogrify() = 0;
}

class Gadget : public Widget {
  virtual void transmogrify() override {}
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*igt 32

virtual覆盖时,关键字无效.派生函数是基类中定义的虚函数的签名匹配,将覆盖基本定义,并且无论virtual关键字是否在派生类中使用,都将在vtable中输入覆盖.

因为override如果不发生重写,关键字将导致编译错误,virtual关键字组合无用.

在这里,有一个备忘单:

| Keyword used | Matching virtual function in base class | Result                   |
|--------------|-----------------------------------------|--------------------------|
| Neither      | No                                      | New non-virtual function |
| Neither      | Yes                                     | Override                 |
| virtual      | No                                      | New virtual function     |
| virtual      | Yes                                     | Override                 |
| override     | No                                      | Compile error            |
| override     | Yes                                     | Override                 |
| Both         | No                                      | Compile error            |
| Both         | Yes                                     | Override                 |
Run Code Online (Sandbox Code Playgroud)


min*_*iot 3

游戏迟到了,但这个 C++ 核心指南似乎在这里相关:

C.128:虚函数应准确指定virtualoverride或 之一final

原因

可读性。检测错误。显式编写virtualoverridefinal是自记录的,使编译器能够捕获基类和派生类之间类型和/或名称的不匹配。然而,编写这三者中的一个以上既是多余的,也是潜在的错误来源。

简单明了:

  • virtual确切地说,只是“这是一个新的虚拟函数”。
  • override确切地说,仅意味着“这是一个非最终覆盖者”。
  • final确切地说,仅意味着“这是最终的覆盖者”。