Wie rufe ich eine übergeordnete Klassenfunktion aus einer abgeleiteten Klassenfunktion auf?

Lesezeit: 8 Minuten

Wie rufe ich eine ubergeordnete Klassenfunktion aus einer abgeleiteten Klassenfunktion
IaCoder

Wie rufe ich die übergeordnete Funktion aus einer abgeleiteten Klasse mit C++ auf? Zum Beispiel habe ich eine Klasse namens parentund eine Klasse namens child die vom Elternteil abgeleitet ist. Innerhalb jeder Klasse gibt es eine print Funktion. In der Definition der Druckfunktion des Kindes möchte ich die Druckfunktion der Eltern aufrufen. Wie würde ich vorgehen?

  • Alle oben genannten Lösungen gehen davon aus, dass Ihre Druckfunktion eine statische Methode ist. Ist dies der Fall? Wenn das Verfahren nicht statisch ist, sind die obigen Lösungen nicht relevant.

    – hhafez

    11. Dezember 2008 um 10:51 Uhr

  • hhafez, Sie irren sich, die Syntax base::function() sieht aus wie eine statische Methodenaufrufsyntax, funktioniert aber in diesem Kontext für Instanzmethoden.

    – Motti

    13. Dezember 2008 um 18:59 Uhr

  • Ich würde MSVC __super nicht verwenden, da es plattformspezifisch ist. Obwohl Ihr Code möglicherweise nicht auf einer anderen Plattform ausgeführt wird, würde ich die anderen Vorschläge verwenden, da sie dies in der beabsichtigten Sprache tun.

    – Teaser

    13. Oktober 2010 um 23:39 Uhr

  • Mögliches Duplikat von Kann ich die virtuelle Funktion einer Basisklasse aufrufen, wenn ich sie überschreibe?

    – Archmed

    9. August 2017 um 1:36 Uhr

  • Das Antimuster, in dem sich abgeleitete Klassen immer befinden erforderlich übergeordnete Klassenfunktionen aufzurufen ist Super anrufen

    – Rufus

    5. März 2019 um 3:43 Uhr


Wie rufe ich eine ubergeordnete Klassenfunktion aus einer abgeleiteten Klassenfunktion
Motti

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

Wenn es eine Funktion mit derselben Signatur in der abgeleiteten Klasse gibt, können Sie sie eindeutig machen, indem Sie den Namen der Basisklasse gefolgt von zwei Doppelpunkten hinzufügen base_class::foo(...). Beachten Sie, dass C++ dies im Gegensatz zu Java und C# tut nicht ein Schlüsselwort für “die Basisklasse” haben (super oder base), da C++ unterstützt Mehrfachvererbung was zu Unklarheiten 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 können Sie nicht zweimal direkt von derselben Klasse ableiten, da es keine Möglichkeit gibt, auf eine der Basisklassen über die andere zu verweisen.

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

  • Warum möchten Sie zweimal von derselben Klasse erben?

    – Paul Brewczyński

    5. Oktober 2013 um 18:39 Uhr

  • @bluesm: Im klassischen OOP macht es nicht viel Sinn, aber in der generischen Programmierung template<class A, class B> class C: public A, public B {}; kann dazu führen, dass zwei Typen aus Gründen, die davon abhängen, wie Ihr Code verwendet wird, gleich sind (dadurch werden A und B gleich), können zwei oder drei Abstraktionsschichten von jemandem entfernt sein, der nicht weiß, was Sie getan haben.

    – Emilio Garavaglia

    18. November 2013 um 18:37 Uhr

  • Ich denke, es ist nützlich hinzuzufügen, dass diese Methode der übergeordneten Klasse aufgerufen wird, auch wenn sie nicht direkt in der übergeordneten Klasse implementiert ist, aber ist in einer der übergeordneten Klassen in der Vererbungskette implementiert.

    – Maxim Lawrow

    26. Dezember 2014 um 10:30 Uhr

  • @Mathai Und deshalb solltest du nicht verwenden using namespace std.

    – JAB

    8. Oktober 2015 um 21:06 Uhr

  • +1 für die Angabe You should note that unlike Java and C#, C++ does not have a keyword for "the base class".

    – TechNyquist

    16. September 2016 um 8:15 Uhr

Wie rufe ich eine ubergeordnete Klassenfunktion aus einer abgeleiteten Klassenfunktion
Greg Hewgill

Bei einer übergeordneten Klasse mit dem Namen Parent und eine untergeordnete Klasse namens Childkönnen Sie so etwas tun:

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 tatsächliche Name der Klasse und kein Schlüsselwort.

  • Dies wäre natürlich nur nützlich, wenn der Basisaufruf mit anderer Logik durchsetzt wäre, sonst hätte es keinen Sinn, die Funktion zu überschreiben, also ist es vielleicht ein bisschen zu auf den Punkt 😉

    – Unterstrich_d

    11. April 2016 um 13:20 Uhr


  • @underscore_d tatsächlich ist es nützlich, auch wenn der Basisaufruf nicht mit anderer Logik durchsetzt war. Nehmen wir an, die übergeordnete Klasse macht so ziemlich alles, was Sie wollen, stellt aber eine Methode foo() zur Verfügung, die Benutzer von child nicht verwenden sollen – entweder weil foo() in child bedeutungslos ist oder externe Aufrufer von child vermasseln, was child ist tun. So kann child in bestimmten Situationen parent::foo() verwenden, aber eine Implementierung von foo bereitstellen, damit sie foo() von parent vor dem Aufruf verbergen.

    – iheanyi

    22. April 2016 um 18:56 Uhr

  • @iheanyi Klingt interessant, aber tut mir leid, ich verstehe es noch nicht. Ist foo() hier analog zu print() oder eine eigene Funktion? Und meinst du mit verwenden private Vererbung, um Details zu verbergen, die von der Basis geerbt wurden, und Bereitstellung public Schattenfunktionen für Dinge, die Sie tun aussetzen willst?

    – Unterstrich_d

    22. April 2016 um 19:02 Uhr


  • @underscore_d Ja, foo() war analog zu print(). Lassen Sie mich auf die Verwendung zurückkommen print() da ich denke, dass es in diesem Zusammenhang sinnvoller wäre. Nehmen wir an, jemand hat eine Klasse erstellt, die eine Reihe von Operationen für einen bestimmten Datentyp ausführt, einige Zugriffsmethoden verfügbar macht und eine hat print(obj&) Methode. Ich brauche eine neue Klasse, die funktioniert array-of-obj aber alles andere ist gleich. Die Komposition führt zu einer Menge doppelten Codes. Vererbung minimiert das, in print(array-of-obj&) Schleifenaufruf print(obj&)möchte aber nicht, dass Kunden anrufen print(obj&) weil es für sie keinen Sinn macht

    – iheanyi

    25. April 2016 um 15:34 Uhr

  • @underscore_d Dies basiert auf der Annahme, dass ich die gemeinsamen Teile der ursprünglichen Elternklasse nicht umgestalten kann oder dass dies unglaublich kostspielig ist. Private Vererbung könnte funktionieren, aber dann verlieren Sie die öffentlichen Zugriffsmethoden, auf die Sie sich verlassen haben – und müssten daher Code duplizieren.

    – iheanyi

    25. April 2016 um 15:37 Uhr


1647069611 225 Wie rufe ich eine ubergeordnete Klassenfunktion aus einer abgeleiteten Klassenfunktion
Andreas Rollen

Wenn Ihre Basisklasse aufgerufen wird Baseund Ihre Funktion wird aufgerufen FooBar() Sie können es direkt mit aufrufen Base::FooBar()

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

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

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

Rufen Sie die übergeordnete Methode mit dem Auflösungsoperator für den übergeordneten Bereich auf.

Eltern::methode()

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

Wenn der Zugriffsmodifikator der Elementfunktion der Basisklasse geschützt ODER öffentlich ist, können Sie die Elementfunktion der Basisklasse aus der abgeleiteten Klasse aufrufen. Der Aufruf der nicht virtuellen und virtuellen Elementfunktion der Basisklasse von der abgeleiteten Elementfunktion kann erfolgen. Bitte beziehen Sie sich auf das Programm.

#include<iostream>
using namespace std;

class Parent
{
  protected:
    virtual void fun(int i)
    {
      cout<<"Parent::fun functionality write here"<<endl;
    }
    void fun1(int i)
    {
      cout<<"Parent::fun1 functionality write here"<<endl;
    }
    void fun2()
    {

      cout<<"Parent::fun3 functionality write here"<<endl;
    }

};

class Child:public Parent
{
  public:
    virtual void fun(int i)
    {
      cout<<"Child::fun partial functionality write here"<<endl;
      Parent::fun(++i);
      Parent::fun2();
    }
    void fun1(int i)
    {
      cout<<"Child::fun1 partial functionality write here"<<endl;
      Parent::fun1(++i);
    }

};
int main()
{
   Child d1;
   d1.fun(1);
   d1.fun1(2);
   return 0;
}

Ausgabe:

$ g++ base_function_call_from_derived.cpp
$ ./a.out 
Child::fun partial functionality write here
Parent::fun functionality write here
Parent::fun3 functionality write here
Child::fun1 partial functionality write here
Parent::fun1 functionality write here

1647069612 10 Wie rufe ich eine ubergeordnete Klassenfunktion aus einer abgeleiteten Klassenfunktion
hervorragend

struct a{
 int x;

 struct son{
  a* _parent;
  void test(){
   _parent->x=1; //success
  }
 }_son;

 }_a;

int main(){
 _a._son._parent=&_a;
 _a._son.test();
}

Referenzbeispiel.

  • Könnten Sie bitte in einer Erklärung bearbeiten, warum/wie dieser Code die Frage beantwortet? Nur-Code-Antworten werden nicht empfohlen, da sie nicht so einfach zu lernen sind wie Code mit einer Erklärung. Ohne eine Erklärung dauert es erheblich mehr Zeit und Mühe, zu verstehen, was getan wurde, welche Änderungen am Code vorgenommen wurden oder ob der Code nützlich ist. Die Erklärung ist sowohl für Leute wichtig, die versuchen, aus der Antwort zu lernen, als auch für diejenigen, die die Antwort bewerten, um zu sehen, ob sie gültig ist oder eine Abstimmung wert ist.

    – Makyen

    23. Februar 2015 um 5:30 Uhr

  • Diese Antwort bezieht sich auf verschachtelte Klassen, während sich die Frage auf abgeleitete Klassen bezog (obwohl die Wörter „Eltern“ und „Kind“ etwas irreführend sind) und daher die Frage überhaupt nicht beantwortet.

    – Johannes Matokic

    5. August 2015 um 7:54 Uhr


993010cookie-checkWie rufe ich eine übergeordnete Klassenfunktion aus einer abgeleiteten Klassenfunktion auf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy