2014-02-07 2 views
5

In meinem Code aufrufen, ich habe diese Klassen implementiert:C++: ein Kind Methode von den Eltern Instanziierung

class A 
{ 
    public: 
    virtual int fun() { return 0; } 
} 

class B : public A 
{ 
    public: 
    virtual int fun() { return 1; } 
} 

Und diese Funktionen:

void operation(A a) 
{ 
    printf("%d\n",a.fun()); 
} 

int main() 
{ 
    B b; 
    operation(b); 
    return 0; 
} 

Wie Sie sehen können, die Klasse B erbt von A und implementiert die virtuelle geerbte Methode fun(). Die Hauptklasse ruft eine Funktion auf, die ein A in Parameter akzeptiert und die fun()-Methode mit einem B-Objekt in Argument aufruft.

Bei der Ausführung erwarte ich, dass die Zeichenfolge "1" gedruckt werden, aber es ist "0", das ist (auch wenn es sich um ein B-Objekt ist, das zu operation() geben wird).

Ich muss dies tun, weil ich mehrere B-Klassen (B1, B2, etc ...) habe und ich möchte, dass die Funktion generisch ist. Ich brauche nicht die Umsetzung der operation() in der Klasse A, aber wenn ich operation() rein virtuelle erklären, schlägt die Kompilierung bei operation() sagen, dass ich nicht ein instanziiert kann (es ist durchaus zu erwarten).

Ich habe viele Themen sprechen über Eltern/Kind-Methoden Anrufe und Vererbung gefunden, aber keiner von ihnen über dieses Problem gerade gesprochen.

Kann mir jemand helfen?

Danke.

+0

Vorsicht: Für die Standardkonstruktion eines Objekts dürfen Sie keine Klammern verwenden. 'B b()' ruft nicht 'B's Standard-c'tor auf, sondern deklariert eine Funktion' b', die keine Argumente annimmt und ein Objekt der Klasse 'B' zurückgibt. –

+0

Es ist nur ein Fehler, den ich gemacht habe, als ich dieses vereinfachte Codebeispiel schrieb – Vultrao

Antwort

9

Sie müssen das Objekt durch Verweis übergeben oder einen Zeiger übergeben

void operation(A& a) 

Weil Sie von Wert sind vorbei, das abgeleitete Objekt in Scheiben geschnitten wird - ein neues Objekt vom Typ A wird im Rahmen des Geschaffenen Funktion.

+0

Das scheint jetzt offensichtlich, dass Sie es sagen. Funktioniert jetzt gut, vielen Dank ^^! – Vultrao