在C ++ 11中的析构函数之后重写标识符

虚拟析构函数声明之后的覆盖标识符是否有特殊含义?

class Base { public: virtual ~Base() {} virtual int Method() const {} }; class Derived : public Base { public: virtual ~Derived() override {} virtual int Method() override // error: marked override, but does not override - missing const {} }; 

在虚拟方法上使用覆盖标识符是有用的,因为检查:当基本虚拟方法实际上没有被覆盖时,编译器将报告错误。

在虚拟析构函数上的重写是否也有任何意义/function?

3 Solutions collect form web for “在C ++ 11中的析构函数之后重写标识符”

不是具有特殊意义的override ,而是析构函数本身:

10.3虚拟function

6即使析构函数没有inheritance,派生类中的析构函数也会覆盖声明为虚拟的基类析构函数。 见12.4和12.5。

如果你把这个和前面的条款结合起来:

5 /如果虚函数用virt-specifier覆盖标记,并且不覆盖基类的成员函数,则该程序是格式不正确的。 [例如:

 struct B { virtual void f(int); }; struct D : B { void f(long) override; // error: wrong signature overriding B::f void f(int) override; // OK }; 

– 例子]

你可以看到如果一个析构函数被标记为override但是这个基类没有一个virtual析构函数,那么这个程序是不合格的。

是。 如果基本析构函数不是虚拟的,那么override标记将导致程序不能编译:

 class Base { public: ~Base() {} }; class Derived : public Base { public: virtual ~Derived() override //error: '~Derived' marked 'override' but does // not override any member functions {} }; 

由于编译器输出告诉你,你必须标记你的方法const

 class Derived : public Base { public: // ... virtual int Method() const override {} }; 

以覆盖基类中的方法

  • 是否使用lambda函数/expression式支持constexpr?
  • lambda函数对象中的静态variables如何工作?
  • 使用基于范围的for循环时需要迭代器
  • std :: this_thread :: sleep_for()和GCC
  • Boost.Spirit使用这个不寻常的C ++模板特性的名字是什么?
  • 如何“int main(){(([()(){})());}”有效的C + +?
  • 为什么你不能把nullptr的地址?
  • 我如何使用一个std :: unique_ptr成员的定制删除器?
  • 什么是在Linux下的GCC使用std :: thread的正确链接选项?
  • function模板的部分sorting - 模糊的调用
  • C ++ 11:为什么std :: condition_variable使用std :: unique_lock?