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?
Ce n'est pas override
qui a une signification particulière, mais le destructeur lui-même:
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é.
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
{}
};