在C ++ 11中的析构函数后覆盖标识符

时间:2013-07-29 11:56:34

标签: c++ c++11 override virtual-destructor

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

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
    {}
};

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

虚拟析构函数上的覆盖是否也有任何含义/功能?

2 个答案:

答案 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不是,而是析构函数本身:

10.3虚函数

  

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析构函数,那么该程序就会格式不正确。