2013-05-18 6 views
5

Ich habe eine Basisklasse mit einer Reihe von geerbten abgeleiteten Klassen. Etwas wie folgt aus:
Polymorphismus und Standardwerte: Kann koexistieren?

class A { 
public: 
    virtual void f(string foo = "bar") { 
     cout << foo << endl; 
    } 
}; 

class B: public A { 
public: 
    void f(string foo = "howdy") { 
     cout << foo << endl; 
    } 
}; 

class C: public A { 
public: 
    void f(string foo = "something") { 
     cout << foo << endl; 
    } 
}; 

ich geerbt nur zwei Klassen der Kürze halber.
Dies ist der Haupt:

A* aArray[] = { 
    new B, 
    new C, 
}; 

int main() { 
    aArray[0]->f(); 
    aArray[0]->f(); 

    return 0; 
} 

Wenn ich das Programm ausführen, die Ausgabe, die ich zurück ist erhalten:

bar 
bar 

Genau wie, wie, wenn der Compiler die Standardargumente der überschriebenen Funktionen ignoriert.
Ist das normal oder gibt es etwas, das ich falsch mache oder das ich vermisse?

+1

Die Standardargumente der Funktion Signaturen unterschiedlich sein machen kann. Stellen Sie Ihre Warnungen auf Maximum und kompilieren Sie sie erneut. –

+0

@ThomasMatthews: Also die Lösung, die sein könnte? Es ist in Ordnung, das Standard-Argument in der Basisklasse virtuellen Funktionen und lassen sie in den vererbten überschrieben Funktionen zu entfernen? – Overflowh

+0

@Overflowh: ein Experiment versuchen: die Standardzuordnungen in der Funktionssignatur und Retest entfernen. –

Antwort

8

Standardwerte sind statisch gebunden. Mit anderen Worten, sie haben kein polymorphes Verhalten. Deshalb haben Sie statt der Standardwerte in den virtuellen Funktionen der abgeleiteten Klassen

gesehen.

Nach Effective C +:

Wenn Standard-Parameterwerte dynamisch gebunden wurden, Compiler wäre eine Möglichkeit, die entsprechenden Standardwerte für die Parameter der virtuellen Funktionen zur Laufzeit zu bestimmen, haben zu kommen, die langsamer sein würde und komplizierter als der aktuelle Mechanismus, sie während der Kompilierung zu bestimmen.