虚拟析构函数声明后的覆盖标识符是否有任何特殊含义?
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
{}
};
在虚方法上使用覆盖标识符作为检查非常有用:当基本虚拟方法实际上未被覆盖时,编译器将报告错误。
虚拟析构函数上的覆盖是否也有任何含义/功能?
答案 0 :(得分:39)
是。如果基础析构函数不是虚拟的,则override
标记将导致程序无法编译:
class Base
{
public:
~Base()
{}
};
class Derived : public Base
{
public:
virtual ~Derived() override //error: '~Derived' marked 'override' but does
// not override any member functions
{}
};
答案 1 :(得分:39)
具有特殊含义的override
不是,而是析构函数本身:
6 /尽管析构函数不是继承的,但是派生类中的析构函数 class重写声明为virtual的基类析构函数;见12.4和 12.5。
如果将此与前一条款一起使用:
5 /如果使用virt-specifier override和虚拟函数标记虚函数 不覆盖基类的成员函数,程序是 病态的。 [例如:
struct B { virtual void f(int); }; struct D : B { void f(long) override; // error: wrong signature overriding B::f void f(int) override; // OK };
-end example]
你可以看到,如果析构函数被标记为override
但是基类没有virtual
析构函数,那么该程序就会格式不正确。