2013-05-18 40 views
5

Bir dizi kalıtsal türetilmiş sınıf ile temel bir sınıfım var. Böyle bir şey:
Polimorfizm ve varsayılan değerler: birlikte olabilir mi?

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

ben kısalık için sadece iki sınıf miras.
Bu ana geçerli:

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

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

    return 0; 
} 

Ben programı, geri is olsun çıkışını çalıştırdığınızda:

bar 
bar 

Tıpkı nasıl derleyici geçersiz kılınan fonksiyonların varsayılan argümanlar görmezden gelirse.
Bu normal midir, yoksa yanlış yaptığım veya eksik olduğum bir şey var mı?

+1

Varsayılan argümanlar, işlev imzalarını farklı yapıyor olabilir. Uyarılarınızı maksimum değere çevirin ve yeniden derleyin. –

+0

@ThomasMatthews: Öyleyse çözüm ne olabilir? Temel sınıf sanal işlevlerindeki varsayılan argümanı kaldırmak ve bunları devralınan geçersiz kılınmış işlevlerde bırakmak tamam mı? – Overflowh

+0

@Overflowh: Deneme yapmayı deneyin: İşlev imzasındaki varsayılan atamaları kaldırın ve yeniden test edin. –

cevap

8

Varsayılan değerler statik olarak bağlanmış. Başka bir deyişle, polimorfik davranışları yoktur. Bu nedenle türetilen sınıfların sanal işlevlerindeki varsayılan değerler yerine

'u gördünüz. Etkili C + göre

:

varsayılan parametre değerleri dinamik olarak bağlanmış olsaydı, derleyiciler yavaş olacağını zamanında sanal fonksiyonlarının parametreleri için uygun varsayılan değerlerini belirlemek için bir yol, ile gelip olurdu ve derleme sırasında mevcut belirleme mekanizmasından daha karmaşıktır.

İlgili konular