Wie die überschriebene Funktion der übergeordneten Klasse in C ++ nennen?

stimmen
-1

Die erwartete Ausgabe:

Child = 2
Parent = 1

Mein Code:

class Parent{
    int a;
    public:
        void display(){
            a = 1;
            cout << Parent =  << a << endl;
        }
};

class Child:public Parent{
    int b;
    public:
        void display(){
            b = 2;
            cout << Child =  << b << endl;
        }
};

int main()
{
    Parent *p = new Child();
    Child c;

    //write your code here
    /* My solution :
      c.display();
      Parent* a = &c;
      a->display();
    */


}

I Gebrauch gemacht statische Bindung erfolgreich das Display () Mitgliedsfunktion aufrufen der Elternklasse

Allerdings frage ich mich, ob es eine bessere Lösung für diese Frage ist.

Was ist der Zweck dieser Linie mit Parent *p = new Child();? Ist es ein Zeiger , der auf einen Konstruktor?

Was ist der Unterschied zwischen dieser Linie und Parent *p = new Child;?

Veröffentlicht am 09/10/2019 um 18:49
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
2

Es gibt mehrere Punkte hier zu machen:

  1. Childnichts überschreibt, ist es nur die Basisklasse Methode versteckt. Übergeordnete würde erfordern , virtualMember - Funktionen, und Sie können überprüfen, ob ein Verfahren tatsächlich überschreibt eine Basisklasse Funktion durch das Hinzufügen overrideSchlüsselwort. Weder Klasse ist polymorph, weil es keine virtuellen Methoden überall sind.

  2. Da Ihre Klassen nicht polymorph sind, werden Sie immer nur statische Bindung haben, keine dynamische Bindung. (Sie identifiziert richtig dies geschieht).

  3. Um eine Basisklasse Funktion aufrufen , die in einer abgeleiteten Klasse überschrieben oder versteckt wurde, als Präfix den Anruf mit der Basisklassennamen und ::, etwa so:

    class Child : public Parent{
      int b;
      public:
        void display(){
          Parent::display();
        }
    };
    
    // or
    
    int main()
    {
      Child c;
      c.Parent::display();
    }
    
  4. Es besteht kein Unterschied zwischen Parent *p = new Child();und Parent *p = new Child;in Ihrem Code, sowohl den Standard - Konstruktor ruft ein neues Kind - Objekt zu initialisieren. Für Typen wie intes einen Unterschied gibt, new int;schafft eine nicht initialisierte intObjekt, new int();(oder new int{};) initialisiert sie stattdessen auf Null.

Beantwortet am 09/10/2019 um 18:59
quelle vom benutzer

stimmen
1

Wie die überschriebene Funktion der übergeordneten Klasse in C ++ nennen?

Sie haben eigentlich keine Funktion in Ihrem Beispiel außer Kraft gesetzt. Nur virtuelle Elementfunktionen außer Kraft gesetzt werden, und displaysind nicht virtuell.

I Gebrauch gemacht statische Bindung erfolgreich das Display () Mitgliedsfunktion aufrufen der Elternklasse

Ihre Lösung funktioniert, weil es keine überwiegende oder virtuelle Funktionen beteiligt. Ein anderer Weg, um die versteckte Memberfunktion aufzurufen ist, den Bereichsauflösungsoperator zu verwenden:

c.Parent::display();

Dies würde statische Bindung verwenden, auch wenn die Funktion war virtuell.


Was ist der Zweck dieser Linie mit Parent *p = new Child();?

Es scheint keinen Zweck in Ihrem Programm zu haben. In der Regel newwird verwendet , um Objekte dynamisch aus dem freien Speicher zuzuweisen.

Ist es ein Zeiger, der auf einen Konstruktor?

Nr pPunkte auf das dynamische Objekt , das in dem freien Speicher erstellt wurde.

Was ist der Unterschied zwischen dieser Linie und Parent *p = new Child;?

Ohne Klammer verwenden Sie Standard-Initialisierung Syntax. mit Klammern verwenden Sie Wert Initialisierung.

Beantwortet am 09/10/2019 um 19:02
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more