2016-05-29 13 views
-2

Ich habe eine Frage: Wie kann ich eine non_virtual Funktion in der Klasse implementieren, die von der abstrakten Klasse abgeleitet ist? Zum Beispiel:C++ Polymorphismus und nicht virtuelle Funktionen

class A { 
    public: 
    virtual void foo() = 0; 
}; 

class B : public A{ 
    public: 
     virtual void foo() { 
      /* some code */ 
     } 
     //B function 
     void Bfoo(){ 
      /* some code */ 
     } 
}; 

int main(){ 
    A* a = new B; 
    a -> foo(); 
    a -> Bfoo(); 
    return 0; 
} 

g ++ bekommt:

error: ‘class A’ has no member named ‘Bfoo’ 
a -> Bfoo(); 

Gibt es eine Möglichkeit Polymorphismus zu verwenden und nicht-virtuelle Funktionen nutzen?

EDIT

Ich weiß, dass eine Bfoo() Funktion nicht hat, so habe ich den Fehler. Ich habe diese Frage gestellt, weil ich nicht verstanden habe, wann Polymorphie sinnvoll ist.

Meine Antwort könnte sein:

ich Polymorphismus, wenn meine abgeleiteten Klassen alle die gleiche Funktion haben und von einer gemeinsamen Basisklasse abgeleitet.

Aber wenn eine Klasse eine andere Funktion hat, sinkt der Polymorphismus?

+0

Es ist nicht klar, was Sie erwarten. 'A' hat keine solche Methode, es sollte offensichtlich sein, warum Sie es nicht von einem Zeiger auf' A' aufrufen können. Dies klingt wie ein XY-Problem, bitte beschreiben Sie, was Sie erreichen möchten. – Rotem

+0

'((B *) a) -> Bfoo()'? –

+0

@PatrickRoberts dieser Fix funktioniert, aber es zwingt zu viel die Bedeutung von Polymorphie. Wenn ich '((B *) a) -> Bfoo() verwende' 'könnte ich' B * a = neues B' anstelle von 'A * b = neues B' verwenden – linofex

Antwort

0

Wenn Sie Funktion Bfoo() mit Zeiger a verwenden möchten, müssen Sie die Funktion Bfoo()-class A als virtual hinzuzufügen.

ich meine

class A { 
    public: 
    virtual void foo() = 0; 
    virtual void Bfoo() {} //this line is necessary 
}; 

EDIT (nach Frage geändert)

Die Kenntnis der Definitionen notwendig. Hier ist die Definition von virtuellen Mitglieder von cplusplus.com

Virtuelle Mitglieder
Ein virtuelles Element ist eine Elementfunktion, die in einer abgeleiteten Klasse neu definiert werden können, während die Berufung Eigenschaften durch Referenzen zu erhalten. Die Syntax für eine Funktion, um virtuell zu werden, besteht darin, ihre Deklaration dem virtuellen Schlüsselwort voran zu stellen.

Siehe resource für Definitionen von Polymorphismus und Virtuelle Funktionen/Mitglieder.

+0

Hallo, diese Lösung kann richtig sein, wenn ich nur "Klasse B" als abgeleitete Klasse habe, aber was ist mit "Klasse C: öffentliches A"? Ich sollte 'Bfoo()' mit leeren '{}' implementieren, aber die Schnittstelle meines Programms ist schlecht und nicht überhaupt lesbar – linofex

0

Eine abgeleitete Klasse kann zusätzliche nicht-virtuelle Funktionen haben, aber sie müssen von einem Zeiger oder Verweis auf die abgeleitete Klasse aufgerufen werden.

Der Punkt des Polymorphismus ist, dass der aufrufende Code sich nicht darum kümmern muss, in welcher konkreten Klasse die Variable, auf die er wirkt, ist.

Normalerweise wären solche Methoden Teil der privaten Implementierung einer Klasse und nicht Teil der öffentlichen Schnittstelle. Alle nicht virtuellen Methoden für die öffentliche Darstellung in einer abgeleiteten Klasse erzwingen implizit, dass der aufrufende Code den konkreten Typ der Klasse kennt.

Sie könnten natürlich Ihre A* zu einem B* werfen, aber diese Art von besiegt den Punkt der Polymorphie. Es ist schwierig, spezifischere Ratschläge zu geben, ohne ein konkretes Beispiel dafür zu geben, was Sie tun möchten.

+0

Hallo, vielen Dank für die Antwort. Im Moment habe ich kein Beispiel. Die Frage steigt, wenn ich versuche, eine Übung zu lösen, und ich denke über Polymorphismus nach. Vielleicht muss ich mehr über dieses (wichtige) Argument lernen und den Punkt des Polymorphismus gut verstehen. – linofex