在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 {} };
以覆盖基类中的方法