770 Stimmen

Wie ruft man eine Funktion der übergeordneten Klasse von einer Funktion der abgeleiteten Klasse auf?

Wie rufe ich die übergeordnete Funktion aus einer abgeleiteten Klasse mit C++ auf? Ich habe zum Beispiel eine Klasse namens parent und eine Klasse namens child die von der Mutter abgeleitet ist. Innerhalb von jeder Klasse gibt es eine print Funktion. In der Definition der Druckfunktion des Kindes möchte ich einen Aufruf an die Druckfunktion der Eltern vornehmen. Wie würde ich dies tun?

971voto

Motti Punkte 104854

Ich gehe das Risiko ein, das Offensichtliche zu sagen: Sie rufen die Funktion auf, und wenn sie in der Basisklasse definiert ist, ist sie automatisch in der abgeleiteten Klasse verfügbar (es sei denn, sie ist private ).

Wenn es in der abgeleiteten Klasse eine Funktion mit der gleichen Signatur gibt, können Sie sie durch Hinzufügen des Namens der Basisklasse, gefolgt von zwei Doppelpunkten, eindeutig identifizieren base_class::foo(...) . Sie sollten beachten, dass C++ im Gegensatz zu Java und C# keine no haben ein Schlüsselwort für "die Basisklasse" ( super o base ), da C++ unterstützt Mehrfachvererbung was zu Zweideutigkeiten führen kann.

class left {
public:
    void foo();
};

class right {
public:
    void foo();
};

class bottom : public left, public right {
public:
    void foo()
    {
        //base::foo();// ambiguous
        left::foo();
        right::foo();

        // and when foo() is not called for 'this':
        bottom b;
        b.left::foo();  // calls b.foo() from 'left'
        b.right::foo();  // call b.foo() from 'right'
    }
};

Übrigens kann man nicht zweimal direkt von der gleichen Klasse ableiten, da es keine Möglichkeit gibt, auf eine der Basisklassen über die andere zu verweisen.

class bottom : public left, public left { // Illegal
};

270voto

Greg Hewgill Punkte 882617

Angesichts einer übergeordneten Klasse namens Parent und eine untergeordnete Klasse namens Child können Sie etwa so vorgehen:

class Parent {
public:
    virtual void print(int x);
};

class Child : public Parent {
    void print(int x) override;
};

void Parent::print(int x) {
    // some default behavior
}

void Child::print(int x) {
    // use Parent's print method; implicitly passes 'this' to Parent::print
    Parent::print(x);
}

Beachten Sie, dass Parent ist der eigentliche Name der Klasse und kein Schlüsselwort.

39voto

Andrew Rollings Punkte 13882

Wenn Ihre Basisklasse den Namen Base und Ihre Funktion heißt FooBar() können Sie es direkt aufrufen mit Base::FooBar()

void Base::FooBar()
{
   printf("in Base\n");
}

void ChildOfBase::FooBar()
{
  Base::FooBar();
}

32voto

Andrey Punkte 4051

In MSVC gibt es dafür ein Microsoft-spezifisches Schlüsselwort: __super


MSDN: Ermöglicht es Ihnen, explizit anzugeben, dass Sie eine Basisklassenimplementierung für eine Funktion aufrufen, die Sie überschreiben.

// deriv_super.cpp
// compile with: /c
struct B1 {
   void mf(int) {}
};

struct B2 {
   void mf(short) {}

   void mf(char) {}
};

struct D : B1, B2 {
   void mf(short) {
      __super::mf(1);   // Calls B1::mf(int)
      __super::mf('s');   // Calls B2::mf(char)
   }
};

11voto

Dean P Punkte 1233

Aufruf der übergeordneten Methode mit dem Operator zur Auflösung des übergeordneten Bereichs.

Parent::method()

class Primate {
public:
    void whatAmI(){
        cout << "I am of Primate order";
    }
};

class Human : public Primate{
public:
    void whatAmI(){
        cout << "I am of Human species";
    }
    void whatIsMyOrder(){
        Primate::whatAmI(); // <-- SCOPE RESOLUTION OPERATOR
    }
};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X