web-dev-qa-db-fra.com

Remplacer l'identifiant après le destructeur en C ++ 11

L'identifiant de remplacement après la déclaration du destructeur virtuel a-t-il une signification particulière?

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

L'utilisation de l'identificateur de remplacement sur la méthode virtuelle est utile pour vérifier: le compilateur signalera une erreur lorsque la méthode virtuelle de base n'est pas réellement remplacée.

Le remplacement du destructeur virtuel a-t-il également un sens/une fonction?

53

Ce n'est pas override qui a une signification particulière, mais le destructeur lui-même:

10.3 Fonctions virtuelles

6/Même si les destructeurs ne sont pas hérités, un destructeur dans une classe dérivée écrase un destructeur de classe de base déclaré virtuel; voir 12.4 et 12.5.

Si vous prenez cela conjointement avec la clause précédente:

5/Si une fonction virtuelle est marquée avec la substitution virt-specifier et ne remplace pas une fonction membre d'une classe de base, le programme est mal formé. [ Exemple:

struct B { 
    virtual void f(int); 
}; 

struct D : B
{ 
    void f(long) override; // error: wrong signature overriding B::f
    void f(int) override; // OK 
}; 

—Fin exemple]

vous pouvez voir que si un destructeur est marqué override mais que la classe de base n'a pas de destructeur virtual, le programme est mal formé.

40
John Dibling

Oui. Si le destructeur de base n'est pas virtuel, le marquage override empêchera le programme de compiler:

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

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