在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?

不是具有特殊意义的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 {} }; 

以覆盖基类中的方法