Frage

Ich möchte fragen, was passieren wird, wenn ich virtuelle Funktionen verwenden, ohne Zeiger? zum Beispiel:

#include <iostream>
using namespace std;
class Parent
{
 public:
   Parent(int i) { }
   virtual void f() { cout<<"Parent"<<endl; }
};

class Child : public Parent
{
 public:
   Child(int i) : Parent(i) { }
   virtual void f() { Parent::f(); cout<<" Child"<<endl; }
};

int main()
{
    Parent a(2);
    Parent b = Child(2);
    a.f();
    b.f();
    return 0;
}

^^ Warum funktioniert es nicht? Wo kann ich etwas darüber, wie virtuelle Methoden finden wirklich?

War es hilfreich?

Lösung

Dieser Effekt wird als "Slicing."

Parent b = Child(2); // initializes a new Parent object using part of Child obj

In C ++ kann der dynamische Typ unterscheiden sich nur vom statischen Typ für Verweise oder Zeiger. Sie haben ein direktes Objekt. So war Ihr Verdacht im Wesentlichen richtig.

Andere Tipps

Versuchen Sie Folgendes:

std::auto_ptr<Parent> b = new Child(2);

In Ihrem Code kopieren Sie Teil Child Objekt b. Dies wird so genannt Objekt Slicing .

Virtuelle Funktion Mechanismus ist nur aktiviert, wenn die virtuelle Funktion entweder durch einen entsprechenden Hinweis oder einen entsprechenden Zeiger aufgerufen wird. Beachten Sie, dass virtueller Funktionsaufruf Mechanismus in Konstruktor / Destruktor oder während der Verwendung des Operators :: unterdrückt wird.

Wenn der Code wie unten dargestellt, wird virtueller Funktionsmechanismus aktiviert werden.

Child c;
Parent &a = c;
a.f();

Ohne Zeiger, wird der Anruf statisch gebunden, auch wenn es sich um eine virtuelle Funktionsaufruf ist.

EDIT 2:

10,3 $ / 6 - [Anmerkung: die Interpretation der Aufruf einer virtuellen Funktion ist abhängig von der Art des Objekts, für die sie (Der dynamische Typ) genannt wird, wohingegen die Interpretation eines Anrufs von einem nicht virtuelle Elementfunktion hängt nur von der Art des Zeigers oder bezeichnet, dass das Bezugsobjekt (das statischer Typ) (5.2.2). ]

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top