在C++中同时使用virtual和override使用函数是危险的吗?那是否会让你因重载而产生歧义?
显然,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)
游戏迟到了,但这个 C++ 核心指南似乎在这里相关:
C.128:虚函数应准确指定
virtual、override或 之一final原因
可读性。检测错误。显式编写
virtual、override或final是自记录的,使编译器能够捕获基类和派生类之间类型和/或名称的不匹配。然而,编写这三者中的一个以上既是多余的,也是潜在的错误来源。简单明了:
virtual确切地说,只是“这是一个新的虚拟函数”。override确切地说,仅意味着“这是一个非最终覆盖者”。final确切地说,仅意味着“这是最终的覆盖者”。