C++ Uso dell'override con virtuale in C ++ 11 e versioni successive


Esempio

L' override specificatore ha un significato speciale in C ++ 11 in poi, se aggiunto alla fine della firma della funzione. Questo significa che una funzione è

  • Override della funzione presente nella classe base e
  • La funzione di classe Base è virtual

Non vi è alcun significato di run time di questo identificatore poiché è inteso principalmente come indicazione per i compilatori

L'esempio seguente dimostrerà il cambiamento nel comportamento con il nostro senza utilizzare l'override.

Senza intervento override :

#include <iostream>

struct X {
    virtual void f() { std::cout << "X::f()\n"; }
};

struct Y : X {
    // Y::f() will not override X::f() because it has a different signature,
    // but the compiler will accept the code (and silently ignore Y::f()).
    virtual void f(int a) { std::cout << a << "\n"; }
};

Con override :

#include <iostream>

struct X {
    virtual void f() { std::cout << "X::f()\n"; }
};

struct Y : X {
    // The compiler will alert you to the fact that Y::f() does not
    // actually override anything.
    virtual void f(int a) override { std::cout << a << "\n"; }
};

Nota che l' override non è una parola chiave, ma un identificatore speciale che può comparire solo nelle firme delle funzioni. In tutti gli altri contesti, l' override può ancora essere utilizzato come identificatore:

void foo() {
    int override = 1; // OK.
    int virtual = 2;  // Compilation error: keywords can't be used as identifiers.
}