Waarvoor wordt het ‘override’ sleutelwoord in C++ gebruikt?

Ik ben een beginner in C++. Ik ben het trefwoord override tegengekomen dat wordt gebruikt in het headerbestand waar ik aan werk. Mag ik weten wat het echte gebruik van override is, misschien met een voorbeeld zou het gemakkelijk te begrijpen zijn.


Antwoord 1, autoriteit 100%

Het zoekwoord override heeft twee doelen:

  1. Het laat de lezer van de code zien dat “dit een virtuele methode is, die een virtuele methode van de basisklasse overschrijft.”
  2. De compiler weet ook dat het een override is, dus hij kan “controleren” of u geen nieuwe methoden aan het wijzigen/toevoegen bent waarvan u denkt dat het overrides zijn.

Om dit laatste uit te leggen:

class base
{
  public:
    virtual int foo(float x) = 0; 
};
class derived: public base
{
   public:
     int foo(float x) override { ... } // OK
}
class derived2: public base
{
   public:
     int foo(int x) override { ... } // ERROR
};

In derived2 zal de compiler een foutmelding geven voor “het wijzigen van het type”. Zonder override zou de compiler hoogstens een waarschuwing geven voor “je verbergt de virtuele methode met dezelfde naam”.


Antwoord 2, autoriteit 20%

En als aanvulling op alle antwoorden, FYI: override is geen trefwoord, maar een speciaal soort identifier! Het heeft alleen betekenis in de context van het declareren/definiëren van virtuele functies, in andere contexten is het gewoon een gewone identifier. Lees 2.11.2 van De Standaard voor details.

#include <iostream>
struct base
{
    virtual void foo() = 0;
};
struct derived : base
{
    virtual void foo() override
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};
int main()
{
    base* override = new derived();
    override->foo();
    return 0;
}

Uitvoer:

[email protected] /work/tests $ g++ -std=c++11 -o override-test override-test.cc
[email protected] /work/tests $ ./override-test
virtual void derived::foo()

Antwoord 3, autoriteit 3%

override is een C++11-sleutelwoord, wat betekent dat een methode een “override” is van een methode uit een basisklasse. Beschouw dit voorbeeld:

   class Foo
   {
   public:
        virtual void func1();
   }
   class Bar : public Foo
   {
   public:
        void func1() override;
   }

Als B::func1() handtekening niet gelijk is aan A::func1() handtekening, wordt er een compilatiefout gegenereerd omdat B::func1() heft A::func1() niet op, maar definieert in plaats daarvan een nieuwe methode genaamd func1().


Antwoord 4

Wikipedia zegt:

Methode overschrijven, in objectgeoriënteerd programmeren, is een taalfunctie waarmee een subklasse of onderliggende klasse een specifieke implementatie kan bieden van een methode die al wordt geleverd door een van zijn superklassen of bovenliggende klassen.

In detail, als je een object foo hebt met een void hello()-functie:

class foo {
    virtual void hello(); // Code : printf("Hello!");
}

Een kind van foo heeft ook een hallo()-functie:

class bar : foo {
    // no functions in here but yet, you can call
    // bar.hello()
}

Het is echter mogelijk dat u ‘Hallo balk!’ wilt afdrukken. wanneer de functie hello() wordt aangeroepen vanuit een bar-object. U kunt dit doen met overschrijven

class bar : foo {
    virtual void hello() override; // Code : printf("Hello Bar!");
}

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes