66

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

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

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

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

4

2 回答 2

53

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

class Base
{
public:
    ~Base()
    {}
};

class Derived : public Base
{
public:
    virtual ~Derived() override //error: '~Derived' marked 'override' but does
                                //        not override any member functions
    {}
};
于 2013-07-29T12:01:34.193 回答
47

不是override那个有特殊含义,而是析构函数本身:

10.3 虚函数

6/即使不继承析构函数,派生类中的析构函数会覆盖声明为虚拟的基类析构函数;见 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 
}; 

—结束示例]

您可以看到,如果标记了析构函数override但基类没有virtual析构函数,则程序格式错误。

于 2013-07-29T12:07:17.320 回答