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

Override identifier after destructor in C++11

本文关键字:标识符 析构函数 C++11 重写      更新时间:2023-10-16

虚拟析构函数声明后的重写标识符有什么特殊含义吗?

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

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

对虚拟析构函数的重写也有任何意义/功能吗?

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

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

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

10.3虚拟功能

6/即使析构函数不是继承的类重写声明为虚拟的基类析构函数;见12.4和12.5.

如果您将此与前面的条款结合使用:

5/如果虚拟函数标记有virt说明符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 
}; 

--结束示例]

您可以看到,如果一个析构函数被标记为override,但基类没有virtual析构函数,则该程序是格式错误的。