2013-05-18 16 views
5

Ho una classe base con un numero di classi derivate ereditate. Qualcosa di simile a questo:
Polymorphism e valori predefiniti: può coesistere?

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; 
    } 
}; 

Ho ereditato appena due classi per brevità.
Questo è il principale:

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

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

    return 0; 
} 

Quando eseguo il programma, l'output che torno a dire:

bar 
bar 

Proprio come come se il compilatore ignora gli argomenti di default delle funzioni ignorata.
È normale o c'è qualcosa che sto sbagliando o che mi manca?

+1

Gli argomenti predefiniti possono rendere diverse le firme di funzione. Trasforma i tuoi avvisi fino al massimo e ricompila. –

+0

@ThomasMatthews: Quindi la soluzione che potrebbe essere? È corretto rimuovere l'argomento predefinito nelle funzioni virtuali della classe base e lasciarle nelle funzioni sovrascritte ereditate? – Overflowh

+0

@Overflowh: prova un esperimento: rimuovi i compiti predefiniti nella firma della funzione e ripeti il ​​test. –

risposta

8

I valori predefiniti sono vincolati staticamente. In altre parole, non hanno un comportamento polimorfico. Ecco perché hai visto

bar 
bar 

invece di quei valori predefiniti nelle funzioni virtuali delle classi derivate.

Secondo Effective C +:

Se i valori dei parametri di default erano legati dinamicamente, compilatori avrebbero dovuto trovare un modo per determinare i valori predefiniti appropriati per i parametri di funzioni virtuali in fase di esecuzione, che sarebbe più lento e più complicato dell'attuale meccanismo di determinarli durante la compilazione.

Problemi correlati